为什么最严格的条件应该列在 where 子句的最后?

sim*_*ing 2 condition

我正在阅读的这本书对为什么将最严格的条件放在WHERE子句最后给出了一个相当糟糕的解释。

假设我们有查询 1:

SELECT COUNT(*)
FROM TEST
WHERE LAST_NAME = 'SMITH'
AND CITY = 'INDIANAPOLIS';
Run Code Online (Sandbox Code Playgroud)

和查询 2:

SELECT COUNT(*)
FROM TEST
WHERE CITY = 'INDIANAPOLIS'
AND LAST_NAME = 'SMITH';
Run Code Online (Sandbox Code Playgroud)

第一个查询需要 20 秒,而第二个查询只需要 10 秒。这本书继续说“因为第二个查询返回更快的结果并且最严格的条件列在 WHERE 子句的最后,可以安全地假设优化器自下而上读取 WHERE 子句。

我很困惑我应该如何做出这个推断。是不是在 1 个条件后过滤比第一个过滤器慢得多?

Ken*_*her 5

多年前就是这种情况(当我开始使用数据库时)。然而,现在优化器已经足够聪明了,您在 WHERE 子句中放置限制的顺序无关紧要。

@PieterGeerkens 提到的是一种称为caching优化器足够智能的东西,可以获取您运行的查询所需的信息并将其放入内存。这当然提供比磁盘 IO 更快的访问。然后,当您运行第二个查询时,所有(或大部分取决于您的数据和 RAM 的大小)数据将已经在内存中。这意味着您的第二个查询会更快。再次正如 Pieter 所说,如果您清除缓存然后以相反的顺序运行查询,第二个查询将再次变得更快。

我希望你的书真的很旧,但无论如何我都会找到一本不同的。有许多不错的免费书籍以及其他免费培训材料。这是一个带有一些很好链接的页面。 http://sqlstudies.com/study-and-reference-tools/