1

我有 2 个 Sql Server 实例和一个查询:

SELECT 
    [DetailDescription],
    [SubTotal]
FROM [dbo].[CRR] WITH (INDEX (IX_CORM_CORMId))
WHERE CORM_CORMId >= 5933168 AND CORM_CORMId <= 5955843

这导致了 2 个查询执行计划: 在此处输入图像描述 在此处输入图像描述

这是上传的版本

一个有 Sort 的得到 301740 行并且需要 48s,另一个得到 286743 行没有 Sort 需要 5s。一个数据库是其他数据库的一个有点过时的副本。表中的行号顺序为 98 419 368。

我的问题是:

  1. 我不明白为什么嵌套循环加入需要排序?我尝试使用“OPTION (QUERYTRACEON 2340)”禁用它。该选项根本没有区别。
  2. 为什么执行时间差异如此之大?如何避免这种情况?

我使用 Sql Server 2014。

更新:

使用统计 IO:

表“CynergyResidualRecord”。扫描计数 1,逻辑读取 1226357,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。表“工作表”。扫描计数 0,逻辑读取 0,物理读取 0,预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

4

2 回答 2

3

CynergyResidualRecordId排序是在执行键查找之前按顺序获取行。

这是一种优化,因此查找在这里讨论的随机 IO 较少。

对 300K 行进行排序当然不需要 48 秒 - 您发布的计划显示排序运算符的实际经过时间为 281 毫秒。

整个计划的实际经过时间是 2.496 秒,所以我不确定你从哪里得到 48 秒。可能 48 秒运行遇到阻塞,或者您的测量方法有问题。

于 2017-07-28T07:54:23.693 回答
0

我认为这是由于过时的统计数据造成的。考虑更新此表的统计信息。

UPDATE STATISTICS [dbo].[CRR];
于 2017-07-27T21:14:04.007 回答