3

我有一个存储过程,通常运行速度相当快(几秒钟),但之后会出现奇数日,具有相同参数的相同过程需要数分钟才能执行。但是如果我在这个时候对索引进行碎片整理,它会在几秒钟内再次开始运行。由于计划不好或分段索引,MS SQL查询速度慢

难道这是因为执行计划不好或碎片化索引?

如果是这样,有没有办法让这个过程不依赖于执行计划或分段索引?

由于提前, 约瑟夫

+1

您应该尝试执行重编译。你还应该包括你的程序。 –

+0

谢谢。让我试试看。 –

+0

请给出关于这个SP的更多细节?任何代码,一段代码,算法,参数可能会提供更多提示... –

回答

4

嗯,这取决于您的SP,该解决方案可能会throught这些选项:

1/WITH RECOMPILE可以节省你的一天。这通过重新编译SP来增加总执行时间,但它可以确保您拥有最佳的执行计划。

2/KEEPFIXED PLAN也可以是一种选择。

3如果您有一组从参数统计的角度来看具有“代表性”的参数,请尝试OPTIMIZE FOR

4监控相关表和索引的碎片级别。检查是否有语句严重更新SP使用的表。如果是,update statisticsUPDATE STATISTICS <tablename>;

5 /参数嗅探也可能是一个根本原因。

您可以进一步了解详情并查看list of causes of recompilations

+0

感谢Mihai,我会进一步探索这些选项。 –

0

简短的回答:没有。 SQL Server依靠执行计划和索引来良好执行。

较长的回答:也许吧。如果在整理索引之后立即提高性能,那么我的第一个问题就是:哪些索引以及它们为什么会碎片化?你在一个独特的标识符上聚类吗?你的统计数据是否是最新的?执行计划是什么样的?

+0

对不起,但我是一个新手。 –

+0

你能指导我如何弄清楚吗? –