SQL 性能:先过滤或先连接

Pul*_*kit 2 sql sql-server join left-join inner-query

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

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

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;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

您能检查一下并让我知道我的想法错在哪里吗?

Gor*_*off 6

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

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

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

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

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

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