【发布时间】:2013-03-15 04:22:23
【问题描述】:
我有一个如下所示的 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 秒内运行,并返回基于 CONDITION1 的 5000 条记录中的 25 条记录。
不过,最近,我向TABLE1 添加了一个新列,然后在上面的查询中将其值用作CONDITION2。该列将继续填充,但过去的所有值都是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 无关,为什么首先执行缓慢?
更新:问题似乎是由缓存的查询计划引起的。所以问题本质上变成了,如何强制刷新查询计划?
UPDATE:虽然做ALTER TABLE可能刷新了执行计划,但问题又回来了。我怎样才能知道发生了什么?
【问题讨论】:
-
能否请您发布查询执行计划?例如。
SET SHOWPLAN_ALL ON go --My SQL Query go SET SHOWPLAN_ALL OFF gO
标签: sql-server sql-server-2008 join indexing execution