我有一个看起来像这样的 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
可能已经刷新了执行计划,但问题又回来了。我怎样才能知道发生了什么?