参考文献:

执行计划的缓存和重新使用

重新编译执行计划

根据数据库新状态的不同,数据库中的某些更改可能导致执行计划效率降低或无效。SQL Server 将检测到使执行计划无效的更改,并将计划标记为无效。此后,必须为执行查询的下一个连接重新编译新的计划。导致计划无效的情况包括:

  1. 对查询所引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW)。
  2. 对执行计划所使用的任何索引进行更改。
  3. 对执行计划所使用的统计信息进行更新,该更新可能是从语句(如 UPDATE STATISTICS)中显示生成,也可能是自动生成的。
  4. 删除执行计划所使用的索引。
  5. 显式调用 sp_recompile
  6. 对键的大量更改(其他用户对由查询引用的表使用 INSERT 或 DELETE 语句所产生的修改)。
  7. 对于带触发器的表,插入的删除的表内的行数显著增长。
  8. 使用 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)。

注意

当 AUTO_UPDATE_STATISTICS 数据库选项被设置为 ON 时,如果查询以表或索引视图为目标,而表或索引视图的统计信息自上次执行后已更新或基数已发生很大变化,查询将被重新编译。此行为适用于标准用户定义表、临时表以及由 DML 触发器创建的 inserted和 deleted表。如果过多的重新编译影响到查询的性能,请考虑将此设置更改为 OFF。当 AUTO_UPDATE_STATISTICS 数据库选项设置为 OFF 时,不会因统计信息或基数的更改而发生任何重新编译,但是,由 DML INSTEAD OF 触发器创建的 inserted和 deleted表除外。因为这些表是在tempdb中创建的,因此,是否重新编译访问这些表的查询取决于 tempdb中 AUTO_UPDATE_STATISTICS 的设置。请注意,在 SQL Server 2000 中,即使此设置为 OFF,查询仍然会基于 DML 触发器 inserted和 deleted表的基数变化进行重新编译。有关禁用 AUTO_UPDATE_STATISTICS 的详细信息,请参阅索引统计信息。

执行计划重编译的时机相关推荐

  1. SQLSERVER执行计划详解

    序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...

  2. SQL Server 执行计划缓存

    原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储 ...

  3. sqlserver 删除字段_SQL Server 执行计划缓存

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之 ...

  4. 一文搞定 SQL Server 执行计划

    导读 数据开发过程中,开发完成的 SQL 发布到生产环境,经常会发生 SQL 执行慢甚至根本无法执行,如何避免这种情况呢?这一篇我们分析一下 SQL Server 的执行计划是如何生成及如何阅读评估执 ...

  5. 存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译

    在存储过程中,经常要引用一些表来存储一些中间数据,用完即删.对于这个中间表,用常规表,临时表或者表变量有什么区别呢? 下面我们看一下这三种中间表是否会造成执行计划的重编译. 首先打开sql serve ...

  6. MySQL执行计划解读

    MySQL执行计划解读 http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765237.html MySQL执行计划解读 Explain语法 E ...

  7. mysql查看执行计划_如何查看MySQL的执行计划

    一.EXPLAIN语法 语法:EXPLAIN SELECT 1.EXPLAIN EXTENDED SELECT 将执行计划"反编译"成SELECT语句,运行SHOW WARNING ...

  8. mysql 执行计划 视频_MySQL执行计划的讲解

    最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面 ...

  9. mysql执行计划命令_【MySQL】EXPLAIN命令详解--解释执行计划

    具体参考: 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索 ...

最新文章

  1. 简单介绍Lua中三种循环语句的使用
  2. Spark MLlib介绍
  3. Spring-学习笔记10【Spring事务控制】
  4. Git之常见零碎问题的原因分析和解决方案
  5. 解决waitfor()阻塞问题
  6. 开发工程师的职场人生路(转)
  7. my-innodb-heavy-4g.cnf
  8. 小度智能音响拆解 芯片_不拆不快:小度音箱拆解测评
  9. 去中心化保险协议InsurAce完成100万美元种子轮融资,DeFiance Capital领投
  10. SSH应用之BBS之路-2、Hibernate配置
  11. pager-taglib 使用说明
  12. java怎样实现重载一个方法
  13. 第三章 垃圾回收的一些概念
  14. 马哥linux的ppt,包合集马哥linux-2016全新专用ppt mysql replication.pdf
  15. python 幂次方_python次方运算
  16. 配电网自动化课程复习总结
  17. 【技术】如何通过局域网连接到惠普HP打印机
  18. 百度人脸识别之人脸注册AddUser
  19. 线段最大重合问题:最多有多少条线段是重合的
  20. element ui注册页面(form+input+steps)

热门文章

  1. FWK005 parse may not be called while parsing
  2. EJB3与Spring的集成
  3. 洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交
  4. NioEventLoopGroup的构造函数
  5. Spring 学习二-----AOP的原理与简单实践
  6. .net .toString() 金额数据转换
  7. DOS下从硬盘安装XP系统方法与要点
  8. [UOJ #167]【UR #11】元旦老人与汉诺塔
  9. 超详细SQLMap使用攻略及技巧分享
  10. javascript 之 面向对象【理解对象】