执行计划重编译的时机

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

参考文献:

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

重新编译执行计划

根据数据库新状态的不同,数据库中的某些更改可能导致执行计划效率降低或无效。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 的详细信息,请参阅 索引统计信息
 
 
 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/09/17/2688537.html,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
295 1
二、Linux文本处理与文件操作核心命令
|
9月前
|
机器学习/深度学习 存储 运维
深度学习在数据备份与恢复中的新视角:智能化与效率提升
深度学习在数据备份与恢复中的新视角:智能化与效率提升
326 19
|
9月前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
Kubernetes Python 容器
[python]使用diagrams绘制架构图
[python]使用diagrams绘制架构图
389 3
|
缓存 数据管理 关系型数据库
数据管理DMS操作报错合集之DMS进行数据导入时遇到了无法识别新增加的实例而旧实例已过期但状态显示正常,如何解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
测试技术 API 开发者
.NET单元测试框架大比拼:MSTest、xUnit与NUnit的实战较量与选择指南
【8月更文挑战第28天】单元测试是软件开发中不可或缺的一环,它能够确保代码的质量和稳定性。在.NET生态系统中,MSTest、xUnit和NUnit是最为流行的单元测试框架。本文将对这三种测试框架进行全面解析,并通过示例代码展示它们的基本用法和特点。
1453 8
|
机器学习/深度学习 人工智能 自然语言处理
深度学习与计算机视觉的结合:技术趋势与应用
深度学习与计算机视觉的结合:技术趋势与应用
636 9
|
11月前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
SQL XML Java
【MyBatis】 MyBatis框架下的高效数据操作:深入理解增删查改(CRUD)
【MyBatis】 MyBatis框架下的高效数据操作:深入理解增删查改(CRUD)
177 1
|
设计模式 缓存 架构师
创建型设计模式的比较与决策
本文深入探讨六种创建型设计模式:单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。通过概述各模式的核心概念、应用场景和关键要素,帮助读者理解并掌握这些模式的核心思想。文章还通过比较表和决策流程图,直观地展示了各模式之间的差异和选择依据,为读者提供了实用的设计模式选择指南。 本文的特色在于结合了理论与实践,每个模式都配有详细的代码示例和结构图,帮助读者更好地理解和应用这些模式。 总之,本文旨在为读者提供一篇全面、深入且实用的创建型设计模式指南,帮助读者在实际工作中灵活运用这些模式...
339 0
创建型设计模式的比较与决策