Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当索引重建发生时,我们是否需要重新编译所有存储过程?_Sql_Sql Server - Fatal编程技术网

Sql 当索引重建发生时,我们是否需要重新编译所有存储过程?

Sql 当索引重建发生时,我们是否需要重新编译所有存储过程?,sql,sql-server,Sql,Sql Server,最近,我在生产服务器上重建了索引。 我是否需要重新编译所有现有的存储过程以使其生效。 请建议。是的,您应该重新编译存储过程(您可以使用)。更改表结构会强制执行一个新的执行计划,但仅仅添加一个索引不会。重新启动Sql Server时,将产生相同的效果 : 因为数据库是由这样的 添加索引或更改 索引列中的数据,原始 用于访问其表的查询计划 应通过以下方式再次进行优化: 重新编译它们。这种优化 第一次发生错误时自动发生 存储过程在SQL之后运行 服务器已重新启动。如果 所使用的基础表 存储过程将更改。

最近,我在生产服务器上重建了索引。 我是否需要重新编译所有现有的存储过程以使其生效。
请建议。

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

:

因为数据库是由这样的 添加索引或更改 索引列中的数据,原始 用于访问其表的查询计划 应通过以下方式再次进行优化: 重新编译它们。这种优化 第一次发生错误时自动发生 存储过程在SQL之后运行 服务器已重新启动。如果 所使用的基础表 存储过程将更改。但是如果 将添加新索引,其中 存储过程可能会受益, 直到 下次调用存储过程时 在SQL Server重新启动后运行。在里面 在这种情况下,可以使用 强制存储过程 下次重新编译它时 执行


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

:

因为数据库是由这样的 添加索引或更改 索引列中的数据,原始 用于访问其表的查询计划 应通过以下方式再次进行优化: 重新编译它们。这种优化 第一次发生错误时自动发生 存储过程在SQL之后运行 服务器已重新启动。如果 所使用的基础表 存储过程将更改。但是如果 将添加新索引,其中 存储过程可能会受益, 直到 下次调用存储过程时 在SQL Server重新启动后运行。在里面 在这种情况下,可以使用 强制存储过程 下次重新编译它时 执行

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

重建索引还将使用fullscan在该索引上重新创建统计信息

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

此外,我不相信凯文答案中的引用是正确的(至少从SQLServer2008+开始)

以下两份白皮书都声明“向表或索引视图添加索引”将导致重新编译

这也是我在测试时看到的

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
执行计划显示自动使用新索引

分析器显示原因为“架构已更改”的自动重新编译

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

重建索引还将使用fullscan在该索引上重新创建统计信息

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

此外,我不相信凯文答案中的引用是正确的(至少从SQLServer2008+开始)

以下两份白皮书都声明“向表或索引视图添加索引”将导致重新编译

这也是我在测试时看到的

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
执行计划显示自动使用新索引

分析器显示原因为“架构已更改”的自动重新编译


不过,这也适用于重建吗?非常感谢Kevin,你能提供一些msdn的相关文章吗?请查看“来自msdn”的链接。应该链接到文章。@JNK-不,不会。重建将自动更新统计数据与全面扫描无论如何,所以你得到一个基于优化的重新编译,由于更新的统计数据。我认为这个答案中的引语无论如何都不正确。它与其他文档和测试相矛盾。我提出要求审查差异。@JNK-确认文档不正确,将进行更新。但这也适用于重建吗?非常感谢Kevin,你能提供一些有关此的msdn文章吗?请查看“来自msdn”的链接。应该链接到文章。@JNK-不,不会。重建将自动更新统计数据与全面扫描无论如何,所以你得到一个基于优化的重新编译,由于更新的统计数据。我认为这个答案中的引语无论如何都不正确。它与其他文档和测试相矛盾。我提出要求审查差异。@JNK-确认文档不正确,将进行更新。