单一条件会大大减慢SQL查询速度

时间:2013-03-15 04:22:24

标签: sql-server sql-server-2008 join indexing execution

我有一个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可能已刷新执行计划,但问题仍然存在。我怎样才能知道发生了什么?

1 个答案:

答案 0 :(得分:0)

听起来您的查询计划已缓存,而新列的统计信息显示它完全充满空值,强制进行表扫描。在ALTER TABLE之后,刷新了查询计划,再次使用索引lookujp重新执行表扫描,并且性能恢复正常。

确定是否发生这种情况的唯一方法是检查两个查询的查询计划,但现在已经很久了。