SQL优化技巧 - 避免COUNT DISTINCT多列
· 阅读需 3 分钟
Copyright © 2023 PawSQL
问题定义
当你使用COUNT (DISTINCT) 进行多列的计算时,它的计算结果可能和你预想的不同。COUNT (DISTINCT col) 计算该列除 NULL 之外的不重复行数,而COUNT (DISTINCT col, col2)则会排除掉任何一列为NULL的行。
譬如对于如下的查询,对列a和列组合(a,b)的统计不同值的个数,
select count(distinct t.a) a_cnt, count(distinct t.a,t.b) a_b_cnt from (values row(1,2),row(3,null)) as t(a,b);
其返回对于列a为2,而对于列组合(a,b)则为1,这可能不符合您的预想,需特别关注。
审查预警
PawSQL针对此情况提供相应的SQL审查预警。
默认预警级别
- 提示
从低到高三个预警级别,提示 < 警告 < 禁止
触发条件
- SQL中存在COUNT DISTINCT函数
- COUNT的参数包括二个或两个以上的表达式
- 参数至少有一个是可以为空的
数据库类型及版本
- MySQL
- openGauss
- Oracle
- PostgreSQL
- KingbaseES
- MariaDB