【发布时间】:2014-08-31 18:15:11
【问题描述】:
我有一个从 5 个表中获取数据的存储过程。表在一小时内更新大约 1000 条记录和 1000 次更新。插入和更新后,存储过程会超时。
当我重建存储过程中引用的表的索引之一时,它再次开始正常工作..但在每更新 1000 条新记录后它再次崩溃。
我该怎么办?
【问题讨论】:
标签: sql sql-server stored-procedures indexing statistics
我有一个从 5 个表中获取数据的存储过程。表在一小时内更新大约 1000 条记录和 1000 次更新。插入和更新后,存储过程会超时。
当我重建存储过程中引用的表的索引之一时,它再次开始正常工作..但在每更新 1000 条新记录后它再次崩溃。
我该怎么办?
【问题讨论】:
标签: sql sql-server stored-procedures indexing statistics
好的,当您说重建索引正在解决问题时,我认为您在这里弄错了。
我认为实际上重建索引会使缓存的执行计划无效,并且在重建索引后的下一次执行将强制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
【讨论】: