我有一个存储过程,它通常运行得非常快(几乎几秒钟),但是在奇怪的日子里,具有相同参数的相同过程需要几分钟才能执行。但是,如果我此时对索引进行碎片整理,它会在几秒钟内再次开始运行。
这可能是因为糟糕的执行计划或碎片索引吗?
如果是这样,有没有办法让这个过程不依赖于执行计划或碎片索引?
在此先感谢,约瑟夫
我有一个存储过程,它通常运行得非常快(几乎几秒钟),但是在奇怪的日子里,具有相同参数的相同过程需要几分钟才能执行。但是,如果我此时对索引进行碎片整理,它会在几秒钟内再次开始运行。
这可能是因为糟糕的执行计划或碎片索引吗?
如果是这样,有没有办法让这个过程不依赖于执行计划或碎片索引?
在此先感谢,约瑟夫
好吧,根据您的 SP,解决方案可能是通过以下选项:
1/WITH RECOMPILE
可以节省你的一天。这通过重新编译 SP 增加了总执行时间,但它确保您将拥有最佳执行计划。
2/KEEPFIXED PLAN
也是一种选择。
OPTIMIZE FOR
3/如果您有一组从统计角度来看具有“代表性”的参数,那么值得一试。
4/ 监控相关表和索引的碎片级别。检查是否有大量更新您的 SP 使用的表的语句。如果是,更新统计信息( UPDATE STATISTICS <tablename>;
)
5/ 参数嗅探也可能是根本原因。
您可以进一步了解详细信息并查看重新编译的原因列表。
简短的回答:没有。SQL Server 依赖于执行计划和索引来很好地执行。
更长的答案:也许。如果你的性能在对索引进行碎片整理后立即提高,那么我的第一个问题是:哪些索引,以及它们为什么会出现碎片?您是否在唯一标识符上进行聚类?您的统计数据是最新的吗?执行计划是什么样的?