参考文献:
重新编译执行计划
根据数据库新状态的不同,数据库中的某些更改可能导致执行计划效率降低或无效。SQL Server 将检测到使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:
- 对查询所引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW)。
- 对执行计划所使用的任何索引进行更改。
- 对执行计划所使用的统计信息进行更新,该更新可能是从语句(如 UPDATE STATISTICS)中显示生成,也可能是自动生成的。
- 删除执行计划所使用的索引。
- 显式调用 sp_recompile。
- 对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
- 对于带触发器的表,插入的或删除的表内的行数显著增长。
- 使用 WITH RECOMPILE 选项执行存储过程。
为了使语句正确,或要获得可能更快的查询执行计划,大多数都需要进行重新编译。
在 SQL Server 2000 中,只要批处理中的语句导致重新编译,就会重新编译整个批处理,无论此批处理是通过存储过程、触发器、即席批查询,还是通过预定义的语句进行提交。在 SQL Server 2005 中,只有在批处理中导致重新编译的语句才会被重新编译。由于这种差异,SQL Server 2000 和 SQL Server 2005 中的重新编译计数不可比较。另外,由于 SQL Server 2005 扩展了功能集,因此,具有更多重新编译类型。
语句级重新编译有助于提高性能,因为在大多数情况下,只有少数语句导致了重新编译并造成相关损失(指 CPU 时间和锁)。因此,避免了批处理中其他不必重新编译的语句的这些损失。
SQL Server Profiler SP:Recompile 跟踪事件在 SQL Server 2005 中报告语句级重新编译。此跟踪事件在 SQL Server 2000 中仅报告批处理重新编译。此外,在 SQL Server 2005 中,将填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必须跟踪 SP:StmtStarting 或SP:StmtCompleted 以获取导致重新编译的 Transact-SQL 文本的做法。
SQL Server 2005 也添加了一个新跟踪事件,称为 SQL:StmtRecompile,它报告语句级重新编译。此跟踪事件可用于跟踪和调试重新编译。SP:Recompile 仅针对存储过程和触发器生成,而 SQL:StmtRecompile 则针对存储过程、触发器、即席批查询、使用 sp_executesql 执行的批处理、已准备的查询和动态 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一个整数代码,用以指明重新编译的原因。下表包含每个代码号的意思。
EventSubClass 值 | 说明 |
---|---|
1 | 架构已更改。 |
2 | 统计信息已更改。 |
3 | 编译已延迟。 |
4 | SET 选项已更改。 |
5 | 临时表已更改。 |
6 | 远程行集已更改。 |
7 | FOR BROWSE 权限已更改。 |
8 | 查询通知环境已更改。 |
9 | 分区视图已更改。 |
10 | 游标选项已更改。 |
11 | 已请求 OPTION (RECOMPILE)。 |