【发布时间】:2018-03-25 10:52:48
【问题描述】:
我有三个表,即员工、部门和申诉。雇员表有超过一百万条记录。我需要找到员工的详细信息,他/她的部门以及他/她提出的申诉。
我可以想到以下两个查询来找到结果:
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 逻辑处理顺序,第一个查询应该执行得更好/更快,因为内部查询中只有一条记录,并且将与进一步的表连接。 但是,在执行这两个查询时,我没有发现任何性能差异,而且两个查询几乎都需要相同的时间。
请检查一下,让我知道我哪里想错了吗?
【问题讨论】:
-
你可以使用“实际执行计划”吗? [Ctrl + M] 在运行查询之前?
-
如果您查看执行计划,您应该能够看到两个查询的数据是如何获取的。
-
查看估计/实际计划。 SQL 立即向表Employees 抛出一个谓词值
-
SQL 语言是声明性的而不是过程性的,因此您描述的是所需的结果,而不是指导 SQL Server 如何处理查询。优化器可以重构语义相同的查询,以便以最有效的方式返回结果。
-
处理您的索引和统计数据 - 这些是大型表性能的关键
标签: sql sql-server join left-join inner-query