iPa*_*h ツ 6 join sql-server sorting sql-server-2014
考虑以下示例:
DECLARE @suppliedNumber MONEY
SET @suppliedNumber = 245656.00
SELECT
ah.FirstName,
ah.LastName
FROM
AccountHolders AS ah
JOIN
[dbo].[Accounts] AS a
ON
ah.Id = a.AccountHolderId
GROUP BY
ah.FirstName, ah.LastName
HAVING SUM(a.Balance) > @suppliedNumber
Run Code Online (Sandbox Code Playgroud)
如您所见,查询中没有任何排序。但是查看执行计划,我看到了隐式排序:
为什么会这样?这背后的技术原因是什么?
我在 Windows NT 6.3 (Build) 上使用 Microsoft SQL Server 2014 (RTM-CU14) (KB3158271) - 12.0.2569.0 (X64) May 27 2016 15:06:08 版权所有 (c) Microsoft Corporation Express Edition(64 位) 14393:)
我不认为join正在产生那种
该group by sum是生产排序
的查询计划查看订单
这可能会更快
如果目的是多个具有相同名称的帐户,它会中断
SELECT ah.Id, ah.FirstName, ah.LastName
FROM
AccountHolders AS ah
JOIN
[dbo].[Accounts] AS a
ON
ah.Id = a.AccountHolderId
GROUP BY
ah.Id, ah.FirstName, ah.LastName
HAVING SUM(a.Balance) > @suppliedNumber
Run Code Online (Sandbox Code Playgroud)
或者
SELECT ah.Id, ah.FirstName, ah.LastName
FROM AccountHolders AS ah
JOIN ( select AccountHolderId
from [dbo].[Accounts] A
GROUP BY Id
HAVING SUM(Balance) > @suppliedNumber
) a
on a.AccountHolderId = ah.ID
Run Code Online (Sandbox Code Playgroud)
正如@sp_BlitzErik 在他的评论中提到的,流聚合运算符需要对输入进行排序:
Stream Aggregate 运算符按一或多个列对行进行分组,然后计算查询返回的一个或多个聚合表达式。此运算符的输出可以被查询中的后续运算符引用,返回给客户端,或两者兼而有之。Stream Aggregate 运算符需要按其组内的列排序的输入。如果数据由于先前的 Sort 运算符或由于有序索引查找或扫描而尚未排序,则优化器将在此运算符之前使用 Sort 运算符。在 SQL Server Management Studio 中的 SHOWPLAN_ALL 语句或图形执行计划中,GROUP BY 谓词中的列列在 Argument 列中,聚合表达式列在 Defined Values 列中。
如果添加索引,FirstName, LastName您可能会看到排序消失(如果查询优化器决定使用索引)。
| 归档时间: |
|
| 查看次数: |
4175 次 |
| 最近记录: |