内部联接顺序以及对性能的影响

时间:2014-09-11 12:50:20

标签: sql sql-server

这两个查询的性能是否相同?

select a.* 
from a 
inner join b 
    on a.bid = b.id 
inner join c 
    on b.cid = c.id 
where c.id = 'x'

select a.* 
from c  
inner join b 
    on b.cid = c.id 
join a 
    on a.bid = b.id 
where c.id = 'x'

首先加入所有表格然后过滤条件,还是首先应用条件来减少连接?

(我使用的是sql server)

3 个答案:

答案 0 :(得分:1)

在将c加入其他两个表之前,查询优化器几乎总是先过滤表c。您可以通过查看执行计划来验证这一点,并查看SQL Server从表c中参与连接的行数。

关于加入订单:查询优化工具会选择一个它认为最适合您的查询的加入订单。它可以是a JOIN b JOIN (filtered c)(filtered c) JOIN a JOIN b

如果您想强制执行某个订单,请附上提示:

SELECT      *
FROM        a
INNER JOIN  b  ON ...
INNER JOIN  c  ON ...
WHERE       c.id = 'x'
OPTION (FORCE ORDER)

这将强制SQL Server执行a join b join (filtered c)标准警告:除非您发现性能大幅提升,否则将连接顺序保留在查询优化工具上的次数最多。

答案 1 :(得分:0)

了解http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm

执行顺序是FROM然后WHERE,在这种情况下或在任何其他情况下我不认为在JOINS之前执行WHERE子句。

答案 2 :(得分:0)

select a.* 
from (select * from c where c.id = 'x') c
inner join b 
    on b.cid = c.id 
inner join a 
    on a.bid = b.id 

这可能会造成执行上的差异。