2012-06-03 75 views
1

当我执行下面的查询与执行plan.I可以看到'排序'是最成本的任务。但我没有在我的查询中使用任何排序选项。为什么它正在发生?select之前有一个嵌套循环连接任务。请让我知道关于合并连接,散列连接和嵌套循环连接。为什么在执行计划中有一个排序任务

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) 
+0

不解决您的排序问题,但[这个总体规划形状的很好的概述是在这里(HTTP:// sqlblog .com/blogs/paul_white/archive/2010/07/28/partitioning-and-the-common-subexpression-spool.aspx) –

回答

3

在您的SQL查询中,实际上将数据排序为列(Ename)排序中的组可能是性能瓶颈,但您需要了解。如果排序确实会导致性能问题,那么您可以按建议将其移动到索引由Aaaroon Bertrand提供。

嵌套连接的重复是SQLserver实际执行2查询返回您的结果。

一个是在子查询中写入的平均(工资),另一个是从员工表中选择Ename的外部查询,这是使用聚集索引扫描完成的。然后将这两个查询组合起来以返回所需的结果。它基本上将来自子查询的每一行与来自满足谓词的外部查询的每一行进行比较。

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

对于深入的讲解你可以通过下面的链接 Nested join Hash Join Merge Join

5

它进行排序以确定哪些行具有较低的薪水每的TerritoryID - 这样的排序是因为这个划分/分组。

你可以得到一个指数摆脱了排序操作,如:

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

但是你必须确定是否收益为这个查询中,它是如何经常执行的背景下,证明了额外的索引 - 这可能会影响工作负载的其他部分。您将在某个时间支付排序/分组费用。

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

+1

F1赛程慢点比较的好处 – Lijo

相关问题