SQL问题:WHERE子句的顺序是否有所不同?

时间:2009-09-22 04:10:19

标签: sql performance

从性能的角度来看,我的SQL WHERE语句的顺序是否有所不同?

例如

SELECT ... FROM ...
WHERE a > 1
AND b < 2

这会比

更快/更慢
SELECT ... FROM ...
WHERE b < 2
AND a > 1

我们还假设我事先知道a > 1会缩小结果集的范围。

另外,如果我按照WHERE语句的顺序连接两个或多个表,这有关系吗?

6 个答案:

答案 0 :(得分:19)

理论上,没有区别。

有时,特别是对于更简单的优化器,查询计划中存在差异,具体取决于WHERE子句中子句的顺序。有一个中等强烈的论点,即这种差异是一个错误的症状。

类似的评论也适用于加入订单。连接的顺序无关紧要 - 对于相同类型的连接。显然,表Table2是内部连接还是外部连接到另一个表Table1都很重要 - 而且重要的是它是Table1 LEFT JOIN Table2还是Table1 RIGHT JOIN Table2还是Table1 FULL JOIN Table2。但对于一系列INNER JOIN操作,测序无关紧要。如果您正在处理一系列连接,则可能会在某种程度上强制处理订单。

澄清(再次) - 考虑:

(Table1 AS t1 JOIN Table2 AS t2 ON t1.pkcol = t2.fkcol) AS j1
JOIN
(Table3 AS t3 JOIN Table4 AS t4 ON t3.pkcol = t4.fkcol) AS j2
ON j1.somecol = j2.anothercol

编写它的方式,显然程序员期望在连接(j1,j2)之前执行(t1,t2)和(t3,t4)上的连接,但优化器可能能够执行连接不同。例如,如果j1.somecol派生自Table1而j2.anothercol派生自Table4,则优化器可能能够选择Table1.SomeCol = Table4.AnotherCol上的任何其他连接的连接。 WHERE子句中的过滤条件以及各个表上是否存在适当的索引会影响此类问题。这是统计数据在优化程序生成查询计划方式中发挥重要作用的地方。

答案 1 :(得分:11)

不,它没有。大多数现代SQL服务器都包含一个查询优化器,它查看解析查询的所有合理的(*)方法,并且旧服务器可能会根据SELECT子句中的顺序获取提示,而较新的服务器则不会。

另一方面,JOIN的顺序在很大程度上仍然很重要。

编辑:请参阅Jonathan的Leffler的回复,因为他提供了有关JOIN顺序的更多细节。谢谢你,乔纳森!

修改:(*)合理与可能:正如Erikkalen所指出的,优化器不会查看所有的< em>可能的方式,由于在其逻辑中编码的[相当不错的]启发式方法,它将仅根据它为基础索引保留的统计数据来评估似是而非的计划。对于每个计划,它考虑总体成本(或部分成本,当部分成本容易超过另一个计划[修剪]的总成本时),并且最终选择有效使用的计划。虽然SQL查询优化器使用的一般原则是众所周知的,但它们实现的复杂性引入了许多不同的曲折。

答案 2 :(得分:7)

请参阅下文并按照链接(长篇文章,但值得一读):

SQL Server Transact-SQL WHERE

  

如果WHERE子句包含多个   表达方式,一般没有   通过订购获得的性能优势   各种各样的表达方式   特别的顺序。这是因为   SQL Server查询优化器执行此操作   为了你,省去你的努力。那里   这是一些例外,其中   在本网站上讨论。 [7.0,   2000年,2005年]增加了1-24-2006

答案 3 :(得分:2)

没有。优化器根据当前统计信息决定筛选结果的顺序。

答案 4 :(得分:2)

这取决于DBMS。 SQL本身没有说明查询应该如何执行。这取决于具体的实施。

如果你的DBMS有一个非常简单的按顺序解释查询的模型,那么放一个&gt;在你的例子中,第一个(显然)会更快 - 因为DBMS将进行两次传递,其中第二次传递通过一个小得多的结果集。

答案 5 :(得分:0)

如果它来自同一个表,并且查询就像您的示例一样简单,那么它不会产生任何影响。当你变得更复杂并链接更多表时,它可以。