SQL Server:索引没有碎片但查询变慢

时间:2015-08-05 08:16:06

标签: sql sql-server performance sql-server-2008 indexing

在我工作的生产环境中,这是一个非常奇怪的问题。

我们得到了一个经常运行的简单查询,没有任何问题。该表的DBCC DBREINDEX(..)计划每晚上午01:30,通常一切都很好。

但每隔一两周,查询就会变慢,所有用户都无法工作。这发生在清晨(早上9点),所以接下来是索引重建。

当发生这种情况时,我会对该表的两个索引进行重新索引,并且所有索引都恢复正常一周。

如果我检查指数统计数据,当发生减速时一切都很好,碎片约为0.2

如果我检查估计的执行计划PRE和问题之后,我看不到任何变化。

查询非常简单:

SELECT SUM(A.QTY) 
FROM WMSORDER A 
WHERE ((DATAAREAID = '01') AND (INVENTTRANSID = '046830648'))

并且列DATAAREAIDINVENTTRANSID

上有和索引

在这里,我发布了两个图像,其中包含发生问题的索引统计信息:

PRE REINDEX STATISTICS WITH SLOW PERFORMANCE

EXECUTION PLAN

如何避免此问题?

2 个答案:

答案 0 :(得分:0)

您使用的索引不是该查询的最佳索引。执行计划包括KeyLookup以获取数量。我建议你删除该索引并创建以下覆盖索引:

CREATE INDEX IX_WMSORDER_INVENTTRANSID_DATAAREAID 
ON WMSORDER(NVENTTRANSID, DATAAREAID)
INCLUDE (QTY)

答案 1 :(得分:0)

这是参数嗅探的问题。

我解决了在DATAAREAID参数中强制文字而不是使用@parameter。

感谢您的提示