1

我有一个看起来像这样的 SQL 查询:

WITH RES_CTE AS
  (SELECT
  COLUMN1,
  COLUMN2,
  [MORE COLUMNS...]
  ROW_NUMBER() OVER (ORDER BY R.RANKING DESC) AS RowNum 
  FROM TABLE1 As R, TABLE2 As A, TABLE3 As U, TABLE4 As S, TABLE5 As T 
  WHERE R.RID = A.LID 
  AND S.QRYID = R.QRYID
  AND A.AID = U.AID
  AND CONDITION1 = 'VALUE'
  AND CONDITION2 = 'VALUE'
  AND [MORE CONDITIONS...]
),
Results_Cnt AS 
  (SELECT COUNT(*) CNT FROM Results_CTE)
SELECT * FROM Results_CTE, Results_Cnt WHERE RowNum >= 1 AND RowNum <= 25

现在,此查询通常在 1 秒内运行,并返回 5000 条记录中的 25 条记录CONDITION1

不过最近,我向 a 添加了一个新列TABLE1,然后CONDITION2在上面的查询中将其值用作 a。该列将继续填充,但过去的所有值都是NULL.

我在加入表上方阅读了一些内容,这些NULL内容是执行缓慢的原因。该表有大约 1,300,000 条记录。其中 90% 都NULL在有问题的列中。但是该列没有被加入。(正在加入的那个一个INDEX

但是,无论如何,我想通过创建一个新列并简单地复制数据来尝试,如下所示:

ALTER TABLE TABLE1 ADD COL_NEW
UPDATE TABLE1 SET COL_NEW = COL_OLD

我的下一步是用实际值替换 NULL,但首先,只是为了好玩,我将查询更改为使用新字段 COL_NEW 作为条件,问题就消失了。

虽然我很高兴问题消失了,但我无法向自己解释。如果它与 NULL 无关,为什么首先执行缓慢?

更新:看来问题可能是由缓存的查询计划引起的。所以问题本质上变成了,如何强制刷新查询计划?

更新:虽然doingALTER TABLE可能已经刷新了执行计划,但问题又回来了。我怎样才能知道发生了什么?

4

1 回答 1

0

听起来您的查询计划已被缓存,而新列的统计信息显示它完全充满了空值,从而强制进行表扫描。在 ALTER TABLE 之后,查询计划被刷新,再次用索引 lookujp 替换表扫描,性能恢复正常。

确定是否发生了这种情况的唯一方法是检查两个查询的查询计划,但现在这些计划早已不复存在。

于 2013-03-15T05:40:11.560 回答