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;