跳到主要内容

SQL优化技巧 - 避免COUNT DISTINCT多列

· 阅读需 3 分钟
PawSQL Team
Optimize your SQL Queries by Clicks!

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

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,openGauss,Oracle等,提供的SQL优化产品包括

  • PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
  • PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
  • PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以独立安装部署,并通过http/json的接口提供SQL优化服务。PawSQL Engine以docker镜像的方式提供部署安装。

联系我们