过滤器的顺序使 SQL 查询的执行更好

Posted

技术标签:

【中文标题】过滤器的顺序使 SQL 查询的执行更好【英文标题】:Order of Filter to make the execution of SQL query better 【发布时间】:2011-06-08 18:47:39 【问题描述】:

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

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步的结果与Users表的所有记录结合起来。

    应用 WHERE 条件(部门 = 'QA')。

第二个

    将所有 QA 部门记录(过滤集)加入 users 表。

    将步骤 1 的结果与用户表的所有记录连接起来。

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于过滤器的顺序使 SQL 查询的执行更好的主要内容,如果未能解决你的问题,请参考以下文章

sql 如何过滤重复记录

SQL语句执行顺序

从建表到关于sql和MySQL的查询语句执行顺序最新详解

mysql的关键词执行顺序

sql语句执行顺序

sql查询语句并不是最先执行SELECT