SQL Server中的操作顺序是内连接和Where子句性能?

时间:2017-11-07 14:21:06

标签: sql sql-server stored-procedures rdbms

在未命中顺序中使用操作是否存在性能问题?

像 1.所有内部连接首先加入所有条件以后的条件。

    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。所有表格分别在哪里然后内部加入

 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)
    

1 个答案:

答案 0 :(得分:3)

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

  1. 解析查询(并查找各种引用)。
  2. 创建执行计划,其优化阶段基于查询需要完成的任务。
  3. 查询计划正在执行。
  4. 作为优化的结果,您编写查询的方式通常对性能的影响比您想象的要小。很多人都非常努力地找出优化查询的最佳方法 - 并且可能有许多你甚至都不知道的事情(比如不同的连接算法,连接排序,推迟表达式评估等等) )。

    对于您的示例,SQL Server优化程序应生成相同的执行计划。引擎非常聪明,意识到这些引擎确实在做同样的事情。

    注意:并非所有查询引擎都适用。有些人的优化程度很差,而且性能会有差异。