首页 > 解决方案 > SQL:WHERE 子句可以提高 SELECT DISTINCT 查询的速度吗?

问题描述

所以这是具体情况:我为数据库中的每个条目设置了主唯一索引键,但每一行都有一个引用条目属性的 secondID,因此,secondID不是唯一的。这些行还有另一个属性,我们称之为isTitle,默认为NULL,但每组具有相同secondID的条目至少有一个条目的isTitle值为 1。

考虑到上述情况,WHERE子句是否会提高查询的处理速度?请参阅以下内容:

SELECT DISTINCT secondID FROM table;

对比

SELECT DISTINCT secondID FROM table WHERE isTitle = 1;

编辑:

没有 WHERE 子句的第一个查询更快,但有人能解释一下为什么吗?从算法上讲,这个过程应该更快,在循环中只有一个“如果”,不是吗?

标签: sqlperformance

解决方案


这是一个很难回答的问题,尤其是在没有指定数据库的情况下。以下是三个重要的考虑因素:

  • 数据库引擎会使用索引secondIDselect distinct?任何体面的数据库优化器都应该,但这并不意味着所有的都可以。
  • 表相对于索引有多宽?也就是说,扫描索引真的比扫描表快得多吗?
  • isTitle = 1与具有相同值的所有行的比率是secondId多少?

对于第一个查询,基本上有两种处理查询的方法:

  1. 扫描索引,获取每个唯一值。
  2. 扫描表,对表进行排序或散列,然后选择唯一值。

如果不明显,(1)比(2)快得多,除非在行数较少的琐碎情况下。

对于第二个查询,唯一真正的选择是:

  • 扫描表,过滤掉不匹配的值,对表进行排序或散列,并选择唯一值。

这里的关键问题是需要扫描多少数据以及过滤掉多少数据。甚至有可能——例如,如果你有无数行secondaryId,没有额外的列,以及少量的值——这可能与上面的 (1) 相当或略快。扫描索引有一点开销,对少量数据进行排序通常很快。

而且,这种方法几乎肯定比(2)快。

正如评论中提到的,您应该使用您的数据测试系统上的查询(使用合理数量的数据!)。或者,更新表统计信息并学习阅读执行计划。


推荐阅读