从性能的角度来看,我的sql WHERE语句的顺序是否有所不同?
例如
SELECT ... FROM ... WHERE a > 1 AND b < 2
这会比任何更快/更慢
SELECT ... FROM ... WHERE b < 2 AND a > 1
我们还假设我事先知道一个> 1将缩小结果集.
而且,如果我加入了两个或多个表,那么WHERE语句的顺序呢?
解决方法
理论上没有区别.
偶尔,特别是使用更简单的优化器,查询计划有所不同,具体取决于WHERE子句中子句的顺序.有一个中等强度的论点,这种差异是一个bug的症状.
类似的评论也适用于加入订单.连接的顺序不要紧,因为连接类型相同.显然,表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
写的方式,程序员期望连接(t1,t2)和(t3,t4)在连接(j1,j2)之前执行,但优化器可能能够以不同的方式进行连接.例如,如果j1.somecol派生于Table1,而j2.anothercol派生于表4中,则优化器可能可以选择Table1.SomeCol = Table4.AnotherCol上的任何其他连接中的连接.这种问题可能会受到WHERE子句中的过滤条件以及各种表中存在或不存在适当索引的影响.统计数据可以在优化器生成查询计划的方式中发挥重要作用.