为什么这个执行计划中Sort算子的成本这么高?
Why is the cost for the Sort operator in this execution plan so high?
Sort 运算符说它只有 100 行要排序。这怎么可能比读取 190 万行更昂贵?我一定是读错了或者误解了什么。
此外,排序运算符中的每次执行的估计行数怎么只有 100?如果 Index Seek 运算符估计 Number of Rows Per Execution 为 190 万,那么只有 100 行如何通过管道传递给 Sort 运算符?
这里是查询:
DECLARE @PageIndex INT = 1000;
DECLARE @PageCount INT = 1000;
SELECT ID
FROM dbo.Table1
WHERE DateCreated >= '2021-10-27'
AND
DateCreated < '2021-10-28'
ORDER BY ID
OFFSET @PageIndex * @PageCount ROWS FETCH NEXT @PageCount ROWS ONLY
排序运算符(与“前 N 排序”相对)将在返回任何行之前在其打开方法中对整个输入进行排序。
SQL 服务器估计搜索将输出 190 万行进行排序。
因此,成本计算用于排序 190 万行。
你在做
OFFSET 1000000 ROWS FETCH NEXT 1000 ROWS ONLY
排序的实际输出行将至少为 1,001,000 (maybe more in a parallel plan),并且 TOP
运算符丢弃偏移量的前百万行,然后在收到 1000 行后停止请求行待退回。
100
的估计只是一个猜测,因为 SQL 服务器不知道编译计划时变量的值在运行时是什么。
Sort 运算符说它只有 100 行要排序。这怎么可能比读取 190 万行更昂贵?我一定是读错了或者误解了什么。
此外,排序运算符中的每次执行的估计行数怎么只有 100?如果 Index Seek 运算符估计 Number of Rows Per Execution 为 190 万,那么只有 100 行如何通过管道传递给 Sort 运算符?
这里是查询:
DECLARE @PageIndex INT = 1000;
DECLARE @PageCount INT = 1000;
SELECT ID
FROM dbo.Table1
WHERE DateCreated >= '2021-10-27'
AND
DateCreated < '2021-10-28'
ORDER BY ID
OFFSET @PageIndex * @PageCount ROWS FETCH NEXT @PageCount ROWS ONLY
排序运算符(与“前 N 排序”相对)将在返回任何行之前在其打开方法中对整个输入进行排序。
SQL 服务器估计搜索将输出 190 万行进行排序。
因此,成本计算用于排序 190 万行。
你在做
OFFSET 1000000 ROWS FETCH NEXT 1000 ROWS ONLY
排序的实际输出行将至少为 1,001,000 (maybe more in a parallel plan),并且 TOP
运算符丢弃偏移量的前百万行,然后在收到 1000 行后停止请求行待退回。
100
的估计只是一个猜测,因为 SQL 服务器不知道编译计划时变量的值在运行时是什么。