SQL Server:为什么需要重新编译存储过程?

Mar*_*arc 3 sql-server stored-procedures

我正在执行我在这个站点上找到的脚本来标记我所有的表和存储过程以进行重新编译。
(我将其更改为也标记存储过程)

我有一个使用大量数据表的 Windows 窗体 (.net 3.5) 应用程序,在执行此脚本后,打开数据量大的窗体所需的时间从 8 秒缩短到仅 4 秒。

我必须定期运行这样的脚本吗?我认为 SQL Server 会负责编译程序等。


顺便说一句:这个问题应该在 SO 上吗?我以为 DBA 会在 SF 上。

Mar*_*ter 9

来自微软

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

强制存储过程重新编译的另一个原因是在必要时抵消存储过程编译的“参数嗅探”行为。当 SQL Server 执行存储过程时,该过程在编译时使用的任何参数值都包含在生成查询计划的过程中。如果这些值代表随后调用过程的典型值,则存储过程每次编译和执行时都会从查询计划中受益。否则,性能可能会受到影响。”