我有一个SQL查询看起来像这样:单一条件减慢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秒的运行,并返回25条记录了5000基于CONDITION1
。
最近,虽然我在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:看起来问题可能是由缓存的查询计划造成的。所以问题基本上变成了,如何强制更新查询计划?
UPDATE:虽然做ALTER TABLE
可能已经刷新执行计划,但问题返回。我如何知道发生了什么?
您可以请发布查询执行计划吗?例如。 'SET SHOWPLAN_ALL ON 去 - 我的SQL查询 去 SET SHOWPLAN_ALL OFF gO' – 2014-02-26 20:49:38