我有两个查询服务于同一目的。
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”的结果与“用户”表的所有记录结合起来。
应用WHERE条件(Department ='QA')。
而第二个
使用users表加入所有QA部门记录(已过滤的集合)。
使用用户表的所有记录加入步骤1的结果。
我假设第二个查询比第一个查询更有效,因为第二个查询在执行的早期阶段应用了过滤器,从而节省了关注者处理更少数量的记录。
但SQL执行计划并未显示两个查询之间的任何差异。请解释一下并验证我对过滤器应用顺序的理解是否正确。
答案 0 :(得分:4)
实际上SQL服务器有关于表的统计数据,可以重新排列连接以创建更优化的执行计划。
查询提示FORCE ORDER
指定在查询优化期间保留查询语法指示的连接顺序。但除非遇到性能问题,否则不要使用它。
答案 1 :(得分:3)
SQL查询中的语句顺序在很大程度上无关紧要。查询将被完全编译,然后根据计算出的执行查询的最佳方式创建执行计划。