探秘重编译(Recompilations)(1/2)

简介:

什么是重编译?

在我谈SQL Server里重编译细节前,首先来看看下面一个很简单存储过程。

复制代码
 1 CREATE PROCEDURE DemonstrateTempTableRecompiles
 2 AS
 3 BEGIN
 4     CREATE TABLE #TempTable
 5     (
 6         ID INT IDENTITY(1, 1) PRIMARY KEY,
 7         FirstName CHAR(4000),
 8         LastName CHAR(4000)
 9     )
10     
11     INSERT INTO #TempTable (FirstName, LastName)
12     SELECT TOP 1000 name, name FROM master.dbo.syscolumns
13     
14     SELECT * FROM #TempTable
15     
16     DROP TABLE #TempTable
17 END
18 GO
复制代码

从代码里可以看出,这个存储过程并没有什么特殊。第1步我们创建临时表,然后临时表里会插入一些记录,最后用简单的SELECT语句获取插入的数据。在SQL Server里,像这样的代码你可能谢了上百次,甚至上千次。

接下来我们用SQL Server Profiler跟踪下重编译事件。点击【工具】->【SQL Server Profiler】。输入登录密码后,会弹出【跟踪属性】窗口。点击【事件选择】,勾选【显示所有事件】,然后在事件列表里勾选【Stored Procedures】下列事件:

  • SP:Starting
  • SP:StmtStarting
  • SP:Recompile
  • SP:Completed

点击【运行】开始跟踪。在我们创建存储过程后,我们运行存储过程。

1 EXEC DemonstrateTempTableRecompiles

从上图可以看到,我们在执行存储过程时,发生了2次重编译。

重编译意味这SQL Server在运行执行计划时,对执行计划进行了重编译。这会带来额外的CPU开销,最后减少服务器工作的吞吐量。但现在的问题是,为什么这些重编译会发生?
SQL Server执行重编译主要是在下列2种情况发生:

  • 架构改变(Scheme Shanges)
  • 统计信息更新(Statistic Updates)

在刚才执行的存储过程里,因为这2个情况我们触发了重编译。我们再来看下刚才的存储过程,第1步我们建立了临时表,当我们在TempDb里建立临时表时,你就改变了你的数据库架构,因为这个原因第1个重编译发生了。

在临时表创建后,你插入了一些记录。因此SQL Server需要去更新临时表聚集索引的统计信息——聚集索引是由SQL Server通过主键(PRIMARY KEY)创建。1个简单的存储过程就引起了SQL Server里2个重编译。哇噢~~~~~

小结

重编译会给临时表带来巨大的性能负荷。另一方面,临时表有准确的统计信息帮助查询优化器生成更好性能的执行计划。因此,当你处理大量数据时,使用临时表才是正确选择。对于小量数据,重编译引起的CPU负荷,比通过统计信息获得性能提升的CPU负荷会高很多。

下篇文章,我会为你介绍表变量(Table Variables),我们会看到使用表变量如何避免重编译的副作用——还有它们带来的其它性能问题。请继续关注!

附:SQL Server 2014的童鞋可以使用下列脚本通过扩展事件(Extended Event)跟踪重编译事件。

复制代码
 1 CREATE EVENT SESSION [TrackRecompiles] ON SERVER 
 2 ADD EVENT sqlserver.sql_statement_recompile
 3 (
 4     ACTION
 5     (
 6         sqlserver.plan_handle,
 7         sqlserver.sql_text
 8     )
 9 ) 
10 ADD TARGET package0.event_file(SET filename = N'c:\temp\TrackRecompiles.xel')
11 WITH
12 (
13     MAX_MEMORY = 4096 KB,
14     EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
15     MAX_DISPATCH_LATENCY = 30 SECONDS,
16     MAX_EVENT_SIZE = 0 KB,
17     MEMORY_PARTITION_MODE = NONE,
18     TRACK_CAUSALITY = OFF,
19     STARTUP_STATE = OFF
20 )
21 GO
22 
23 -- Start the Event Session
24 ALTER EVENT SESSION TrackRecompiles
25 ON SERVER
26 STATE = START
27 GO
复制代码



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4568155.html,如需转载请自行联系原作者

相关文章
|
C# 前端开发
WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer)   OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的《WPF Diagram Designer》一系列文章来做为设计器实现参考,本篇介绍一下codeprojcet的这四个文章,推荐给对图形设计器感兴趣的人去看看,通过WPF的模板功能和其他功能可以很方便的设计出图形编辑器。
4221 0
|
2月前
|
数据采集 人工智能 JavaScript
官网搜索排名第一,AI 却答非所问?我们用 llms.txt + 事实页修好了它
本文详解品牌官网“AI可读性”改造实战:针对AI检索时答非所问、信息错乱问题,系统性解决“进得来、找得到、读得懂、信得过”四大挑战——通过robots放行、llms.txt导览、.md直出、结构化JSON-LD及全网口径统一等工程手段,显著提升AI对品牌的准确理解与引用。
328 0
|
3月前
|
人工智能 JSON 安全
MCP协议入门:理解Model Context Protocol及其在AI开发中的应用
MCP协议(Model Context Protocol)入门教程,详解MCP协议架构、工作原理及在百炼平台中的应用。立即学习,掌握AI应用开发新标准!
326 0
|
5月前
|
缓存 小程序 前端开发
互联网医院系统源码:HIS接口对接流程与数据同步方案
互联网医院系统开发的关键难点在于与医院HIS系统的对接:需通过接口适配层统一数据标准,按业务特性选择实时调用或定时同步策略,并建立完善的接口治理机制(如幂等控制、TraceId追踪、版本管理),以保障数据一致性、系统稳定性与后续扩展性。
|
5月前
|
存储 安全 算法
从数学到 HTTPS:一篇讲透离散对数、DH/DHE/ECDHE 与 TLS 密钥交换
本文从高中指数对数出发,层层深入剖析离散对数难题如何成为HTTPS密钥交换的数学基石;详解DH、DHE(前向安全)、ECDHE(椭圆曲线+临时密钥)的演进逻辑与本质区别;最终落地位于TLS握手全流程,讲透“不安全信道如何安全协商密钥”。240字
448 0
|
JSON 监控 API
Shopee:对接海外仓API实现本地发货,优化物流时效
Shopee卖家可通过对接海外仓API实现本地发货,将物流时效从10-15天缩短至3-5天,显著提升买家体验与店铺转化率。本文详解API对接原理、步骤及代码示例,助力优化跨境物流效率。
|
10月前
|
机器学习/深度学习 运维 数据可视化
基于 YOLOv8 的边坡排水沟堵塞智能检测系统设计与工程实现 [目标检测完整源码]
基于YOLOv8的边坡排水沟堵塞智能检测系统,融合目标检测与PyQt5可视化,实现对排水沟畅通、淤积、堵塞三类状态的自动识别。支持图片、视频、摄像头输入,适用于山区公路、水利工程等场景的智能巡检。系统提供完整源码、预训练模型与数据集,具备高精度、实时性强、易部署等优点,助力地质灾害预警与智慧运维,推动AI技术在工程安全领域的落地应用。
340 5
基于 YOLOv8 的边坡排水沟堵塞智能检测系统设计与工程实现 [目标检测完整源码]
|
10月前
|
人工智能 运维 自然语言处理
不仅是对话:定义2026年“业务驱动型”AI客服机器人的核心能力
2026年,企业对AI客服的期待已从“会说话”转向“能办事”。本文提出业务驱动型AI的四大核心能力:具备决策与编排的“Agent大脑”、完成闭环的执行能力、全渠道连接与人机协同、可持续进化的员工化交付。真正有价值的AI不仅是对话工具,更是可成长、能担责的数字员工,助力企业构建长期服务竞争力。
496 4
|
人工智能 自然语言处理 数据可视化
告别高成本定制:友盟U-AgentBox上线,开发者可一键集成行业模板,3天打造专属企业Agent
12月29日,蚂蚁百宝箱与友盟联合推出面向开发者的智能体产品U-AgentBox,聚焦低门槛、高效率集成专属智能体。通过模板化构建、可视化编辑与轻量级部署,助力开发者快速实现业务智能化升级。
611 0
告别高成本定制:友盟U-AgentBox上线,开发者可一键集成行业模板,3天打造专属企业Agent