2013-03-15 37 views
1

我有一个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可能已经刷新执行计划,但问题返回。我如何知道发生了什么?

+0

您可以请发布查询执行计划吗?例如。 'SET SHOWPLAN_ALL ON 去 - 我的SQL查询 去 SET SHOWPLAN_ALL OFF gO' – 2014-02-26 20:49:38

回答

0

听起来好像你的查询计划被缓存了,而新列的统计数据显示它完全充满了空值,迫使表扫描。在ALTER TABLE之后,刷新查询计划,再次使用索引lookujp重新进行表扫描,并且性能恢复正常。

确切地知道是否发生了什么的唯一方法是检查两个查询的查询计划,但现在已经不复存在了。

+0

你说早就没了,我说的备份:)但我不明白,我该怎么办时,我想不同的下一次向表中添加一列,并有大量的NULL进入? – greener 2013-03-15 05:45:56

+0

表扫描是查询从有声索引的记录1开始,并将所有记录扫描到clusteed索引的末尾。索引查询是当查询步入所需的第一个记录的索引时,并且只需要索引就可以遍历索引,以读取查询所需的所有记录。如果SQL Server估计必须读取大于10%的表记录,则SQL Server将执行表san。查询计划被缓存且未被记录,所以备份将不会检索旧的。 – 2013-03-15 05:50:33

+0

我的备份意思是表现不佳的AWS AMI。 – greener 2013-03-15 05:52:00