【问题标题】:Does inner join order and where as an impact on performance [duplicate]内部连接顺序是否以及对性能的影响[重复]
【发布时间】:2014-09-11 23:43:52
【问题描述】:

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

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'

是先join所有表再过滤条件,还是先应用条件来减少join?

(我用的是sql server)

【问题讨论】:

  • 这可能会有所帮助:Order Of Execution of the query
  • SQL 服务器优化器通常足够聪明,可以找出使用的最佳顺序,因此连接表顺序实际上不会影响性能

标签: sql sql-server


【解决方案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)标准警告:除非您看到性能大幅提升,否则大多数情况下最好将连接顺序留给查询优化器。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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 
      

      这会造成执行上的差异。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        相关资源
        最近更新 更多