【问题标题】:SQL Server : index not fragmented but query became slowSQL Server:索引没有碎片但查询变慢
【发布时间】:2015-10-27 21:40:06
【问题描述】:

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

我们得到了一个简单的查询,它经常运行,没有任何问题。 DBCC DBREINDEX(..) 的餐桌计划在每晚 01.30 点进行,通常一切都很好。

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

当这种情况发生时,我对表的两个索引进行了重新索引,并且在一周内全部恢复正常。

如果我在减速发生时检查索引统计信息,一切都很好,碎片大约在 0.2

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

查询很简单:

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

DATAAREAIDINVENTTRANSID 列上有索引

我在这里发布两张图片,其中包含出现问题的索引统计信息:

PRE REINDEX STATISTICS WITH SLOW PERFORMANCE

EXECUTION PLAN

如何避免这个问题?

【问题讨论】:

  • 分片是0.2还是0.2 %?那是一个很大的区别:) 另外,您确定数据库实际上已经完成了索引的重建吗?很可能维护操作仍在执行中。
  • 可能是参数嗅探。阅读 Erland Sommarskog Slow in the Application, Fast in SSMS? Understanding Performance Mysteries 撰写的这篇出色的文章,了解运行速度快和运行速度慢时的实际 执行计划。很可能会有不同。
  • 你是对的,这是参数嗅探的问题。。用我正在使用的软件(Dynamics AX)的修补程序解决了它

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


【解决方案1】:

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

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

【讨论】:

  • 我知道包含数量会更好,但索引是我无法更改的标准索引。此外,该索引在系统的其他不需要索引数量的区域中经常使用。我真正需要知道的是,为什么有时即使索引没有碎片化,查询也会开始变慢!
【解决方案2】:

这是参数嗅探的问题。

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

谢谢你的提示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多