APPROX_COUNT_DISTINCT是聚合函数。本文为您介绍在交互式分析Hologres中APPROX_COUNT_DISTINCT函数的用法。

语法

APPROX_COUNT_DISTINCT函数用于计算某一列去重后的行数,结果只能返回一个值,并且该值为近似值。
APPROX_COUNT_DISTINCT ( <column> )
参数说明如下表所示。
参数 描述
column 需要近似计算去重后行数的列。

APPROX_COUNT_DISTINCT采用HyperLogLog基数估计的方式进行非精确的COUNT DISTINCT计算。非精确的COUNT DISTINCT计算能提升查询性能,尤其是对于column的离散值比较大的情况,误差率平均可以控制在0.1%-1%以内。该函数适用于对性能敏感并且可以接受误差的场景。

同时,您也可以通过COUNT DISTINCT ( column )的方式进行精确的COUNT DISTINCT计算,使用时资源开销会比较大。

调整误差率

通过使用以下参数调整误差率。
set hg_experimental_approx_count_distinct_precision = 20;
  • 支持取值范围为[12,20],默认值为17。
  • 精度参数含义为HyperLogLog算法的分桶bit位个数,参数越大,代表分桶越多,理论精度越高。
  • 精度参数取值越高,计算时间和内存开销也会相应增大,但都远远小于精确的COUNT DISTINCT ( column )语句带来的开销,因此,推荐选用APPROX_COUNT_DISTINCT替换COUNT DISTINCT ( column )
  • 当精度参数设置为17以上时,Hologres采用HyperLogLog++算法,会对返回值做误差修正,以进一步降低误差、稳定误差。例如hg_experimental_approx_count_distinct_precision取值为20时,多数情况下,可以降低到0.01-0.2%不等的误差率。

示例

计算O_CUSTKEY列去重后行数的近似值,示例语句如下。
SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;

--全局设置精度20,计算O_CUSTKEY列去重后行数的近似值
ALTER DATABASE dbname SET hg_experimental_approx_count_distinct_precision = 20;
SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;

--在Session级别设置精度20
SET hg_experimental_approx_count_distinct_precision = 20;
SELECT APPROX_COUNT_DISTINCT ( O_CUSTKEY ) FROM ORDERS;