SQL 性能 : Filter first or Join first

标签 sql sql-server join left-join inner-query

我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。

我可以想到以下两个查询来查找结果:

<强>1。先过滤记录,只获取需要数据的员工的记录:

SELECT * FROM (SELECT * FROM Employees WHERE EmployeeID= @EmployeeID) Emp    
LEFT JOIN Department Dpt ON Emp.EmployeeID= Dpt.EmployeeID    
LEFT JOIN Grievance Grv ON Emp.EmployeeID= Grv.EmployeeID;

<强>2。先加入:

SELECT * FROM Employees Emp    
    LEFT JOIN Department Dpt ON Emp.EmployeeID= Dpt.EmployeeID    
    LEFT JOIN Grievance Grv ON Emp.EmployeeID= Grv.EmployeeID    
WHERE EmployeeID= @EmployeeID);

如果我们考虑以 FROM>INNER JOIN>OUTER JOIN>WHERE>....SELECT 开头的 SQL 逻辑处理顺序,第一个查询应该执行得更好/更快,因为内部查询只有一个记录,并且将与其他表格一起加入。 但是,在执行这两个查询时,我没有发现任何性能差异,并且两个查询花费的时间几乎相同。

能否请您检查一下,让我知道我哪里想错了?

最佳答案

别担心。查询的处理分三个阶段进行:

  1. 解析
  2. 编译
  3. 执行

编译阶段的一个关键部分是优化。这是 SQL 引擎确定最佳执行计划的时候。

在您的第一个查询中,SQL Server 将忽略子查询。这两个查询应该有相同的执行计划。

注意:并非所有数据库都如此。一些更简单的数据库实际上实现了子查询。

从审美的角度来看,我更喜欢第二个查询——只是为了避免不必要的子查询,所以所有的过滤都在外部 where 子句中(预期的位置)。

关于SQL 性能 : Filter first or Join first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46727600/

相关文章:

php - 连接三个以上的表

t-sql - 您可以在 JOIN w/SQL 上使用 LIKE 运算符进行更新吗?

mysql ->= OR <= 组合会触发全表扫描吗?

sql - DB2 子系统中单个模式下表名的最大数量是多少?

mysql - 尝试从表中删除记录时出现错误 1206

Mysql更新日期相对于特定列的更新

sql - 在 SQL Server 数据库中从一张表批量插入到另一张表

sql-server - TSQL 查找登录名是否具有与登录名相同的密码?

sql-server - Entity Framework 4 与 LINQ to SQL,适用于中小型应用程序,与 SQL Server 配合使用

mysql - 基础数据仓库 - 如何连接 2 个表之外的数据