存储过程是预编译的, 在第一次执行的时候, 会生成执行计划, 以后执行的时候, 会使用这个执行计划(除非存储过程侯或者显示指定重新编译), 而不是每次执行时都去生成执行计划
当存储过程涉及的对象结构调整, 或者相关的数据产生了很大变化, 这可能导致原来的计划不适合当前的现状(执行计划过期), 这种情况下应该重新编译存储过程(可以通过 sp_recompile来标记要重新编译的存储过程)
------------------------------------------------------------------------
use URTracker --更改为URTracker的数据库名称
-- 更新所有试图
DECLARE @ViewName AS VARCHAR(255)
DECLARE cr_AllViews CURSOR FOR
SELECT [name]
FROM sysobjects
WHERE xtype = 'V' and name like 'v_%'
OPEN cr_AllViews
FETCH NEXT FROM cr_AllViews into @ViewName
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT FROM cr_AllViews INTO @ViewName
EXEC sp_recompile @ViewName
END
CLOSE cr_AllViews
DEALLOCATE cr_AllViews
--更新所有存储过程
DECLARE @SprocName AS VARCHAR(255)
DECLARE cr_AllSprocs CURSOR FOR
SELECT [name]
FROM sysobjects
WHERE xtype = 'P' and name like 'sp_%'
OPEN cr_AllSprocs
FETCH NEXT FROM cr_AllSprocs into @SprocName
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT FROM cr_AllSprocs INTO @SprocName
EXEC sp_recompile @SprocName
END
CLOSE cr_AllSprocs
DEALLOCATE cr_AllSprocs
---------------------------------------------------------------------------------
将上述代码对URTracker数据库执行即可。
您也可以通过数据库维护计划自动执行本脚本从而实现定期自动重编译。