我有一个存储过程,可以从5个表中获取数据。表在一小时内更新了大约1000条记录和1000条更新。插入和更新后,存储过程将进入超时状态。
当我重建存储过程中引用的表的索引之一时,它会再次开始正常工作..但在更新每个新的1000条记录后它会再次崩溃。
我该怎么办?
答案 0 :(得分:0)
好的,当你说重建索引解决问题时,我认为你错了。
我认为实际上重建索引会使缓存的执行计划失效,并且在重建索引之后的下一次执行将强制sql server重新编译执行计划。
通常,SQL Serve会对存储过程使用缓存执行计划,但是有一些因素会导致sql server重新编译存储过程的执行计划,即使proc缓存内存中存在缓存执行计划也是如此。重建或对正在执行存储过程的索引所做的任何更改都将导致重新编译执行计划。
由于您每小时插入1000行,因此您还希望更新统计信息。我会说每晚都有一份工作来更新统计数据。
但是对于您的商店程序,在程序的定义中使用WITH RECOMPILE
选项,或者在执行此存储过程时使用此选项,我认为它将解决问题。
在sp的定义中添加此选项
ALTER PROCEDURE myProc
WITH RECOMPILE
AS.......
或者在执行存储过程时添加此选项,您可以执行以下操作
EXECUTE myProc WITH RECOMPILE
或者您也可以使用系统存储过程sp_recompile
强制sql server编译执行计划,即使缓存内存中也有。
EXECUTE sp_recompile N'dbo.MyProc';
GO
EXECUTE dbo.MyPrco;
GO