我有一个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没有任何关系,为什么执行起来很慢?
更新:问题可能是由缓存的查询计划引起的。所以问题基本上就是如何强制查询计划刷新?
更新:虽然执行ALTER TABLE
可能已刷新执行计划,但问题仍然存在。我怎样才能知道发生了什么?
答案 0 :(得分:0)
听起来您的查询计划已缓存,而新列的统计信息显示它完全充满空值,强制进行表扫描。在ALTER TABLE之后,刷新了查询计划,再次使用索引lookujp重新执行表扫描,并且性能恢复正常。
确定是否发生这种情况的唯一方法是检查两个查询的查询计划,但现在已经很久了。