【问题标题】:Order of operation Inner Join and Where clause performance in SQL Server?SQL Server 中的操作顺序内连接和 Where 子句性能?
【发布时间】:2017-11-07 22:30:17
【问题描述】:

错序操作是否存在性能问题?

喜欢 1.先全部Inner join,再全部where条件。

    select * from
    t1
    inner join t2 on t1.t2Id = t2.Id
    inner join t3 on t1.t3Id = t3.Id
    inner join t4 on t2.t4Id = t4.Id
    where 
    t1.Id in (1,2,3,4,5)
    and t2.Id in (1,2,3,4,5,6,7)
    and t3.Name like '%a' 

2。所有表都有各自的 Where 和 Inner join

 select * from
    (select * from t1 where t1.Id in (1,2,3,4,5)) a
    inner join (select * from t2 where t2.Id in (1,2,3,4,5,6,7)) a1 on a.t2Id = 
    a.Id
    inner join (select * from t3 where t3.Name like '%a') a2 on a.t3Id = a2.Id
    inner join t4 on a1.t4Id = t4.Id

可能会影响查询性能?

  1. 还有哪里条件的顺序?

    喜欢

    select * from t1
    inner join t2 on t1.t2Id = t2.Id
    where t1.t2Id in (1,2,3,4,5,6)
    and t2.t3Id in (1,2,3,4,5)
    

【问题讨论】:

  • 你测试了吗?你得到了什么作为指标?哪个跑得更快?
  • 是的,我用少量记录测试了它。也尝试了许多记录,但我没有得到很大的不同。
  • 阅读关系和 DBMS 特定查询优化/实现的介绍,尽可能编写最直接的查询,直到您有更多经验。然后阅读整本书。这些查询都经过简单优化。如果您阅读过一些关于简单查询优化的数不胜数的问题,您会发现它们都值得同样的评论,即相同的答案,在下面重复。在你定义的意思之前,工程中没有“最好”。

标签: sql sql-server stored-procedures rdbms


【解决方案1】:

SQL 查询在运行时会经历三个阶段:

  1. 解析查询(并查找各种引用)。
  2. 已创建执行计划,其中包含基于查询需要完成的优化阶段。
  3. 查询计划正在执行中。

作为优化的结果,您编写查询的方式对性能的影响通常比您想象的要小。很多人都在努力找出优化查询的最佳方法——而且可能有很多你甚至不知道的事情(例如不同的连接算法、连接排序、下推表达式评估等等)。

对于您的示例,SQL Server 优化器应该生成相同的执行计划。引擎足够聪明,可以意识到它们确实在做同样的事情。

注意:并非所有查询引擎都如此。有些优化器很差,性能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多