为什么排序操作在嵌套循环(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 个查询执行计划:

Here is uploaded version

一个有排序得到 301740 行需要 48 秒,另一个没有排序得到 286743 行需要 5 秒。 一个数据库是另一个有点过时的副本。 table 中的行数顺序为 98 419 368。

我的问题是:

  1. 我不明白为什么嵌套循环连接需要排序?我试图用 'OPTION (QUERYTRACEON 2340)' 禁用它。该选项完全没有区别。
  2. 为什么执行时间相差这么大?如何避免这种情况?

我使用 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秒运行遇到了阻塞或者你的测量方法有问题