You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DuckDB中approx_count_distinct小基数场景下的错误率及误差查看方法

DuckDB approx_count_distinct 小基数场景错误率及误差测算方法

小基数场景的错误率情况

DuckDB的approx_count_distinct基于HyperLogLog(HLL)算法实现,这类算法天生为高基数场景优化,小基数(通常指唯一值数量低于1000)下误差会显著上升:

  • 当基数在几百级别时,实际测试的误差通常在5%-20%区间;
  • 极端小基数(如唯一值少于100)时,误差可能更高,甚至出现数倍的偏差。
    官方没有给出小基数场景的精确误差公式,因为偏差受哈希碰撞、桶的稀疏性等随机因素影响,无法用固定公式量化。

手动测量误差的方法

因为DuckDB没有直接输出误差的机制,你可以通过构造已知基数的数据集,对比精确计数和近似计数来测算误差:

  1. 生成固定基数的测试表
    用generate_series构造包含指定数量唯一值的表,示例:
    -- 创建基数为200的测试表
    CREATE TABLE test_small_card AS
    SELECT DISTINCT generate_series(1, 200) AS val;
    
  2. 计算误差率
    同时查询精确计数和近似计数,计算相对误差:
    SELECT
      COUNT(DISTINCT val) AS exact_count,
      approx_count_distinct(val) AS approx_count,
      ROUND(ABS(approx_count_distinct(val) - COUNT(DISTINCT val))::FLOAT / COUNT(DISTINCT val) * 100, 2) AS error_rate_pct
    FROM test_small_card;
    
  3. 多次测试取平均
    HLL是概率型算法,单次结果存在随机波动,多次运行上述查询后取平均误差,能得到更具参考性的结果。

误差与桶数的关系

DuckDB的HLL实现默认使用4096个桶(2^12寄存器),这是标准HLL的常见配置。高基数下,理论误差为1.04/sqrt(m)(m为桶数),但这个公式不适用于小基数场景——小基数下大量桶为空,哈希分布的不均匀会放大偏差。目前DuckDB没有公开参数允许修改桶数,你可以通过查看其源码中的HLL模块确认具体配置。

内容的提问来源于stack exchange,提问作者egor10_4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:42:39