第10/24周 计划缓存

在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用。在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划。那个执行计划然后会被缓存,即被称为计划缓存,用作后期的重用。首先我们来看下即席SQL语句(adhoc SQL statements,对应的反义词:prepared SQL statements)的副作用,即带来的性能问题。

即席SQL语句(adhoc SQL statements)

每次当你提交一个即席SQL语句到SQL Server时,对每个唯一的查询,都会有执行计划被编译。“唯一的查询”是什么意思?答案很简单:SQL Server对完整的SQL语句(包括可能硬编码的参数值)生成一个hash值,并使用这个hash值作为在计划缓存里查找值。如果找到这个值的执行计划,这个计划就会被重用,否则的话新的计划会被编译并最后在计划缓存里缓存。看下我们提交下面这3个查询给SQL Server:

 1 SELECT * FROM Sales.SalesOrderHeader
 2
 3 WHERE CustomerID = 11000
 4
 5 GO
 6
 7 SELECT * FROM Sales.SalesOrderHeader
 8
 9 WHERE CustomerID = 30052
10
11 GO
12
13 SELECT * FROM Sales.SalesOrderHeader
14
15 WHERE CustomerID = 11223
16
17 GO

对这3个查询,SQL Server会编译3个不同的执行计划,因为你提供硬编码的参数值。因此计算出来的hash值在3个查询之间是不同的,找不到被缓存的计划。作为一个副作用,对于几乎相同的查询,你有3个执行计划。这个问题被称为计划缓存污染(Plan Cache Pollution)

你用不同的执行计划污染了你的计划缓存,这些计划是不能被重用的(因为硬编码的参数值),并且你在浪费大量有用的内存,这些内存在SQL Server里可以被其他组件使用。缓存的目的应该是持续数次的高重用,特定SQL语句不属于这个情况。

计划稳定性

如果你参数话你的SQL语句,或者使用存储过程。在那个情况下,SQL Server可以非常容易的重用执行计划。但是即使重用执行计划也会带来性能的问题。比如SQL Server为一个查询编译了一个需要执行书签查找的执行计划,因为用到的非聚集索引没有覆盖到查询字段。

在第8周我们说过,如果你从表获取少量数据,书签查找还是有用的。当你越过临界点时,使用全表/索引扫描将更高效。但是SQL Server如果重用缓存的执行计划,就不会考虑这个选择了——SQL Server只会盲目的重用你的计划——即使性能非常糟糕!我们看看下面的实际执行计划:

这里SQL Server盲目重用了包含书签查找的被缓存的计划。如你所见,估计行数(estimated number of rows  )和实际行数(actual number of rows )完全不同。SQL Server基于假设那个查询只返回1条记录来编译和缓存了计划。但是实际上SQL Server返回了1499条记录。看看执行计划,我们会更清晰,优化器是假设只返回1条记录才执行这个操作的。

这会导致你没有计划稳定性。基于估计行数,你得到书签查找的缓存计划,要不就是如果越过临界点的话是全表/索引扫描。这个是我们在性能调优时经常碰到的性能问题。

如果修正这个问题呢?很简单:通过覆盖非聚集索引来避免书签查找。用这个方法你就得到了计划稳定性,不管你输入的第一个参数是什么值都会有同样的计划和性能。如果你对这个问题感兴趣,可以看下参数嗅探(Parameter Sniffing)。

小结

在这期的性能调优培训里,你看到计划缓存是个双刃剑:一方面,计划缓存非常强大,因为你可以重用已经编译的计划来避免编译成本;另一方面,它非常危险,因为定型的执行计划,你没有计划稳定性,即你不能保证的性能始终如一。

希望这次培训你有所收获,下周我们会详细介绍SQL Server中的重编译。请继续关注!

时间: 2024-10-22 21:30:54

第10/24周 计划缓存的相关文章

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 system

八周一次课 10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron 10.24 chkconfig工具 显示chkconfig服务 系统启动服务在inittab 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 原文地址:http://blog.51cto.com/wbyyy/2066113

[译]SQL Passion Week 10: 计划缓存

Week 9: Plan Caching Adhoc SQL Statements 每次我们向SQL Server提交一个特定的SQL语句时, 查询计划为每一个unique query编译. 什么叫做unique query? 非常简单. SQL Server为完整的SQL语句(包含Hard-coded的值)产生一个Hash值, 作为一个查找值在计划缓存中使用. 如果找到该hash值,再该计划被复用. 否则将会编译一个新的计划, 所以想象一下现在执行下面3个查询 SELECT * FROM Sa

sqLSERVER 计划缓存

在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用.在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划.那个执行计划然后会被缓存,即被称为计划缓存,用作后期的重用.首先我们来看下即席SQL语句(adhoc SQL statements,对应的反义词:prepared SQL statements)的副作用,即带来的性能问题. 即席SQL语句(adhoc SQL statements) 每次当你提交一个即席SQL语句到SQL Server时

Linux系统管理10——进程和计划任务管理

Linux系统管理10——进程和计划任务管理 一.程序和进程的关系 1.程序 ·保存在硬盘.光盘等介质中的可执行代码和数据 ·静态保存的代码 2.进程 ·在CPU及内存中运行的程序代码 ·动态执行的代码 ·父.子进程:每一个进程可以创建一个或多个进程 二.静态查看进程统计信息 ps命令 1.ps aux 命令 (1)作用:以简单列表的形式显示出进程信息 (2)选项释义: a:显示当前终端下的所有进程信息,包括其他用户的进程 u:使用以用户为主的格式输出进程信息 x:显示当前用户在所有终端下的进程

SQLServer中的执行计划缓存由于长时间缓存对性能造成的干扰

本文出处:http://www.cnblogs.com/wy123/p/7190785.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 先抛出一个性能问题,前几天遇到一个生产环境性能极其低下的存储过程,开发人员根据具体的业务逻辑和返回的数据量,猜测到这个存储过程的执行应该不会有这么慢.当时意识到可能是执行计划缓存的问题,因为当前这个存储过程的写法还是比较遵守参数化SQL的规范的(如果是动态即席查询SQL就不

如何用参数化SQL语句污染你的计划缓存

你的SQL语句的参数化总是个好想法.使用参数化SQL语句你不会污染你的计划缓存——错!!!在这篇文章里我想向你展示下用参数化SQL语句就可以污染你的计划缓存,这是非常简单的! ADO.NET-AddWithValue ADO.NET是实现像SQL Server关系数据库数据访问的.NET框架的组成——有一些严重的副作用.不要误解我——只要你正确使用,ADO.NET一直很棒.你马上就会看到,它很容易被错误使用.我们来看下面实现SQL语句执行的C#代码. 1 for (int i = 1; i <=

执行计划缓存

执行计划编译是需要时间的,为了提高效用率,是要缓存的,可用如下方式查看:–查看执行计划的缓存 SELECT UseCounts,RefCounts, Cacheobjtype, Objtype,dbid, ISNULL(DB_NAME(dbid),'ResourceDB') AS DatabaseName, TEXT AS SQL FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) ORDER B

3.10 个人周结

3.10 个人周结 标亮:个人日记.非助教博客,非战斗人员可撤离 日常 LeetCode - 20题 知米单词 - 112词/5天 keep(塑形+放松)- 114分钟 助教 - 这周没做啥事 书 <c++程序设计> - 17级的课本,借来看了前三章. <暗时间> - 很好的书,五楼书不肯外借很迷,看了大概十几页,推荐给了我爹orz. <活着> - 返校前一天用一整个下午看完. 流水账 周六发周结是因为周天晚是日常图书馆值班没时间写() 这学期课太少,写写周结好知道自己

阿里钉钉陈航发布10亿“春雨计划”,推进企业级市场服务创新

8月24日,在阿里巴巴DING峰会重庆站上,阿里钉钉CEO陈航(花名无招)以"解放创新力"为主题,分享了对智能移动办公时代的思考,并在现场宣布,"春雨计划"正式启动,重点扶持钉钉生态中优秀的应用开发者和服务者.一.陈航(无招)对移动办公的思考在玺哥看来,陈航对移动办公的思考主要在以下两点,一是对移动办公时代工作方式的思考,二是对解决传统行业中典型场景问题的思考.对于第一点,在陈航看来,在移动互联网这个信息大爆炸时代,人们工作和生活混淆不清是导致工作不高效,生活也不自