为什么排序操作在嵌套循环(Inner Join)之前?
Why is Sort operation before Nested Loops (Inner Join)?
我有 2 个 Sql 服务器实例和一个查询:
SELECT
[DetailDescription],
[SubTotal]
FROM [dbo].[CRR] WITH (INDEX (IX_CORM_CORMId))
WHERE CORM_CORMId >= 5933168 AND CORM_CORMId <= 5955843
这导致 2 个查询执行计划:
一个有排序得到 301740 行需要 48 秒,另一个没有排序得到 286743 行需要 5 秒。
一个数据库是另一个有点过时的副本。 table 中的行数顺序为 98 419 368。
我的问题是:
- 我不明白为什么嵌套循环连接需要排序?我试图用 'OPTION (QUERYTRACEON 2340)' 禁用它。该选项完全没有区别。
- 为什么执行时间相差这么大?如何避免这种情况?
我使用 Sql Server 2014。
更新:
使用统计 IO:
Table'CynergyResidualRecord'。扫描计数 1,逻辑读取 1226357,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
Table 'Worktable'。扫描计数 0,逻辑读取 0,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
我认为这是由于过时的统计数据造成的。
考虑更新此 table.
的统计信息
UPDATE STATISTICS [dbo].[CRR];
排序是在执行键查找之前按 CynergyResidualRecordId
的顺序获取行。
这是一项优化,因此查找的随机 IO 较少 discussed here。
排序 300K 行当然不应该花费 48 秒 - 您发布的计划显示排序运算符的实际运行时间为 281 毫秒。
整个计划的 actual elapsed time 是 2.496 秒,所以我不确定您从哪里得到 48 秒。可能48秒运行遇到了阻塞或者你的测量方法有问题
我有 2 个 Sql 服务器实例和一个查询:
SELECT
[DetailDescription],
[SubTotal]
FROM [dbo].[CRR] WITH (INDEX (IX_CORM_CORMId))
WHERE CORM_CORMId >= 5933168 AND CORM_CORMId <= 5955843
这导致 2 个查询执行计划:
一个有排序得到 301740 行需要 48 秒,另一个没有排序得到 286743 行需要 5 秒。 一个数据库是另一个有点过时的副本。 table 中的行数顺序为 98 419 368。
我的问题是:
- 我不明白为什么嵌套循环连接需要排序?我试图用 'OPTION (QUERYTRACEON 2340)' 禁用它。该选项完全没有区别。
- 为什么执行时间相差这么大?如何避免这种情况?
我使用 Sql Server 2014。
更新:
使用统计 IO:
Table'CynergyResidualRecord'。扫描计数 1,逻辑读取 1226357,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。 Table 'Worktable'。扫描计数 0,逻辑读取 0,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。
我认为这是由于过时的统计数据造成的。 考虑更新此 table.
的统计信息UPDATE STATISTICS [dbo].[CRR];
排序是在执行键查找之前按 CynergyResidualRecordId
的顺序获取行。
这是一项优化,因此查找的随机 IO 较少 discussed here。
排序 300K 行当然不应该花费 48 秒 - 您发布的计划显示排序运算符的实际运行时间为 281 毫秒。
整个计划的 actual elapsed time 是 2.496 秒,所以我不确定您从哪里得到 48 秒。可能48秒运行遇到了阻塞或者你的测量方法有问题