Filter的顺序可以更好地执行SQ​​L查询

时间:2011-06-08 18:47:40

标签: sql

我有两个查询服务于同一目的。

SELECT * FROM #user 
    INNER JOIN #department ON #user.departmentId = #department.departmentId
    INNER JOIN #user manager ON #department.departmentHead = manager.userid
WHERE #department.DepartmentName= 'QA'

SELECT * FROM #user 
    INNER JOIN #department ON #department.DepartmentName= 'QA' AND #user.departmentId = #department.departmentId 
    INNER JOIN #user manager ON #department.departmentHead = manager.userid

表结构如下。

create table #user
(
    userid int identity(1,1),
    userName varchar(20),
    departmentId int
)

create table #department
(
    departmentId int identity(1,1),
    departmentName varchar(50),
    departmentHead int
)

在性能视角中,我期待两个查询之间存在一些差异。我的假设/理解是第一个查询按此顺序执行。

  1. 加入用户和部门表的所有记录。

  2. 再次将“步骤1”的结果与“用户”表的所有记录结合起来。

  3. 应用WHERE条件(Department ='QA')。

  4. 而第二个

    1. 使用users表加入所有QA部门记录(已过滤的集合)。

    2. 使用用户表的所有记录加入步骤1的结果。

    3. 我假设第二个查询比第一个查询更有效,因为第二个查询在执行的早期阶段应用了过滤器,从而节省了关注者处理更少数量的记录。

      但SQL执行计划并未显示两个查询之间的任何差异。请解释一下并验证我对过滤器应用顺序的理解是否正确。

2 个答案:

答案 0 :(得分:4)

实际上SQL服务器有关于表的统计数据,可以重新排列连接以创建更优化的执行计划。

查询提示FORCE ORDER指定在查询优化期间保留查询语法指示的连接顺序。但除非遇到性能问题,否则不要使用它。

答案 1 :(得分:3)

SQL查询中的语句顺序在很大程度上无关紧要。查询将被完全编译,然后根据计算出的执行查询的最佳方式创建执行计划。