我们需要在索引重建发生时重新编译所有存储过程吗?

时间:2010-12-22 13:21:41

标签: sql sql-server

最近我在生产服务器上完成了重建索引。 我是否需要重新编译所有现有的存储过程才能实现此功能。 请建议。

2 个答案:

答案 0 :(得分:6)

是的,您应该重新编译存储过程(您可以使用sp_recompile)。更改表结构会强制执行新的执行计划,但只添加索引不会。当您重新启动Sql Server时,这将具有相同的效果。

From MSDN

  

由于数据库发生了变化   添加索引或更改的操作   索引列中的数据,原始数据   用于访问其表的查询计划   应该再次优化   重新编译它们。这种优化   第一次自动发生   存储过程在SQL之后运行   服务器重新启动。它也会发生   一个基础表,由...使用   存储过程发生了变化。但如果一个   从中添加新索引   存储过程可能会受益,   优化不会发生,直到   下次存储过程是   重新启动SQL Server后运行。在   这种情况,它可能是有用的   强制存储过程   下次重新编译它   执行

答案 1 :(得分:0)

您的问题是关于“重建索引”,但您接受的答案中的引用是关于创建新索引。

重建索引也将最终使用fullscan重新创建该索引的统计信息。

作为更新统计信息的结果,所有受影响的查询将自动获得基于最佳性的重新编译。除非查询恰好包含KEEPFIXED PLAN提示。

此外,我不相信Kevin的答案中的引用是正确的(至少从SQL Server 2008+开始)。

以下两篇白皮书均指出“向表或索引视图添加索引”导致重新编译。

这也是我在测试时看到的。

CREATE TABLE T(X INT, Y INT);

GO

CREATE PROC P AS SELECT Y FROM T;

GO

EXEC P;

GO

CREATE NONCLUSTERED INDEX IX ON T(Y);

GO

EXEC P;


GO


DROP TABLE T;DROP PROC P

执行计划显示新索引自动使用

enter image description here

Profiler显示自动重新编译,原因是“Schema Changed”

enter image description here