这两个查询的性能是否相同?
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)
答案 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
这可能会造成执行上的差异。