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

19 sql performance

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

例如

SELECT ... FROM ...
WHERE a > 1
AND b < 2
Run Code Online (Sandbox Code Playgroud)

会比这更快/更慢吗?

SELECT ... FROM ...
WHERE b < 2
AND a > 1
Run Code Online (Sandbox Code Playgroud)

让我们假设我事先知道a > 1会缩小结果集.

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

Jon*_*ler 20

从理论上讲,没有区别.

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

类似的评论也适用于加入订单.连接的顺序无关紧要 - 对于相同类型的连接.显然,无论是表表2是内部连接或外部连接到另一个表table1事情做-而且它的事项是否是Table1 LEFT JOIN Table2Table1 RIGHT JOIN Table2Table1 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
Run Code Online (Sandbox Code Playgroud)

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


mjv*_*mjv 12

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

另一方面,JOIN的顺序在更大程度上仍然是重要的.

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

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

  • 连接的顺序无关紧要 - 对于相同类型的连接.显然,表Table2是内部连接还是外部连接到另一个表Table1是否重要 - 并且重要的是它是Table1 LEFT JOIN Table2还是Table2 LEFT JOIN Table1.但是对于INNER JOIN来说,顺序无关紧要.例如,如果您正在处理星型连接,则可能会在某种程度上强制处理订单. (2认同)

ric*_*ott 7

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

SQL Server Transact-SQL WHERE

如果WHERE子句包含多个表达式,则通过以任何特定顺序排序各种表达式通常不会获得性能优势.这是因为SQL Server查询优化器会为您执行此操作,从而节省您的工作量.这方面有一些例外情况,本网站对此进行了讨论.[7.0,2000,2005]已添加1-24-2006


Mit*_*eat 2

不会。优化器根据当前统计数据决定过滤结果的顺序。