为什么执行计划中有排序任务

时间:2012-06-03 15:18:38

标签: sql-server

当我用执行计划执行以下查询时。我可以看到'sort'是最多的costlist任务。但我没有在我的查询中使用任何排序选项。为什么会发生?存在嵌套循环连接任务select.Also请告诉我有关合并连接,散列连接和嵌套循环连接的信息。

enter image description here

select
Ename from dbo.Employee e
where 
Salary>(
select AVG(Salary) from dbo.Employee where 
DeptId=e.DeptId 
group by DeptId)

2 个答案:

答案 0 :(得分:5)

必须排序以确定哪些行具有较低的工资每TerritoryID - 因此排序是由于此分区/分组。

您可以使用索引删除排序操作,例如:

CREATE INDEX d_s ON dbo.Employee(DeptId, Salary);

但是您必须确定此查询的增益是否在执行频率的上下文中证明了额外索引的合理性 - 这可能会影响工作负载的其他部分。您将在某个时候支付排序/分组费用。

另外,只是因为查询中的成本很高,并不意味着这是一个问题。这个查询速度慢吗?即使是一级方程式比赛也有一辆“慢速”赛车在最后一场比赛结束。

答案 1 :(得分:3)

在您的SQL查询中,您实际将数据排序到列上的组(Ename)排序可能是性能瓶颈,但您需要找出。如果排序确实导致性能问题,那么您可以将其移动到索引,如下所示: Aaaroon Bertrand。

嵌套连接的原因是SQLserver实际执行了2个查询以返回结果。

一个是在子查询中编写的Avg(Salary),另一个是从Employee Table中选择Ename的外部查询,该查询是使用Clustered index Scan完成的。然后将这两个查询组合起来以返回所需的结果。它基本上是将子查询中的每一行与满足谓词的外部查询中的每一行进行比较。

只有在连接列上有索引时才可以进行合并连接.Merge连接有时非常快,因为它们已经排序。

如需深入解释,您可以浏览以下链接 Nested join Hash Join Merge Join