最近我在生产服务器上完成了重建索引。 我是否需要重新编译所有现有的存储过程才能实现此功能。 请建议。
答案 0 :(得分:6)
是的,您应该重新编译存储过程(您可以使用sp_recompile)。更改表结构会强制执行新的执行计划,但只添加索引不会。当您重新启动Sql Server时,这将具有相同的效果。
由于数据库发生了变化 添加索引或更改的操作 索引列中的数据,原始数据 用于访问其表的查询计划 应该再次优化 重新编译它们。这种优化 第一次自动发生 存储过程在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
执行计划显示新索引自动使用
Profiler显示自动重新编译,原因是“Schema Changed”