执行计划重用

每次你提交一个查询给SQL Server,SQL Server检查计划缓存来看看是否有现存的缓存计划可供重用。SQL Server对提交的SQL语句计算哈希值,并用这个哈希值在计划缓存里检查现存的执行计划(实际或更复杂,因为其他的选项——例如SET选项——也会影响执行计划重用)。

如果缓存的计划找到,执行计划会重用。不然的话新的执行计划会通过查询优化器编译,最后放入计划作为后期重用。现在假设有下列写的很烂的C#应用程序。

1 for (int i = 1; i <= 10000; i++)
2 {
3    cmd = new SqlCommand(
4    "SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = " + i.ToString(), cnn);
5    SqlDataReader reader = cmd.ExecuteReader();
6    reader.Close();
7 }

这个程序在loop循环里调用了1000次SELECT语句——使用硬编码参数值。使用硬编码参数值,SQL语句的哈希值总会不一样,因此SQL Server不能重用缓存的计划。作为副作用,你在计划缓存里存储了1000个不同的执行计划。

每个执行计划也会占用一些内存(在这里是16KB),因此你浪费了近160M的计划缓存!假设现在你不能修改你程序的实现方法,你还是要提高SQL Server里计划缓存的内存占用。这就要用到“针对即席工作负荷进行优化”服务器配置选项。

针对即席工作负荷进行优化(Optimize for Adhoc Workload)

这个服务器配置选项自SQL Server 2008后就引入了,它用来改变SQL Server缓存和重用执行计划方式。一旦你启用这个配置选项,SQL Server并不再真正缓存你的整个执行计划。SQL Server只存储所谓的编译计划存根(Compiled Plan Stub)。在SQL Server 2014上,对你的SQL语句,存根值是352 bytes的哈希值。

这样的话对于10000个提交的SQL语句现在我们在计划缓存里只需要7MB的内存。这和刚才的160MB相比已经是巨大的区别!使用这个存根值,SQL Server现在能记住先前执行的特定SQL语句。

现在当你再次执行同一SQL语句是,SQL Server在执行计划里找存根值,再次编译你的执行计划,最后在计划缓存里保存完整执行计划结果。因此当SQL语句被执行至少2次时,这个执行计划才会被缓存。SQL语句只执行一次的话(即席SQL语句),在计划缓存里只需要352 bytes。

因此使用这个配置选项你可以减少计划缓存的内存占用——在你的程序里不需要任何修改!可以看下计划缓存文章来了解更多。

小结

在这篇文章里我向你展示了一个非常简单的方法来处理对于写得很糟的应用程序,它用不同的不能重用的执行计划污染你的计划缓存。“针对即席工作负荷进行优化”服务器配置选项也是我经常建议默认启用的。它会他来计划缓存更好的内存管理。

副作用是你引入的轻量的CPU负担,因为每个执行计划必须编译2次才会存储在计划缓存里。当一般来说对于这个额外编译,你应该有足够的CPU可用空间。

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

“针对即席工作负荷进行优化”如何影响你的计划缓存相关推荐

  1. 缓存 负载均衡_使用“针对临时工作负载优化”选项来保存计划缓存存储

    缓存 负载均衡 When you run a query in SQL Server, the SQL Server Query Optimizer will draw the road map fo ...

  2. 针对C64x+的一些优化经验(转帖)

    针对C64x+的一些优化经验(转帖 shmily_liu ) 本人做TI DSP优化过程中的一些积累,显得比较凌乱,但都是比较常用而且非常有必要了解的点,大家可以接在这后面补充自己的经验: >. ...

  3. volatile关键字对编译器优化的影响

    关注.星标公众号,不错过精彩内容 初学的朋友可能不怎么关心优化选项,但对于经验丰富的工程师来说,掌握代码优化是必备技能. 今天讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用 ...

  4. 怎样针对Google做搜索引擎优化

    Google以使用200多个排名因子而闻名. 甚至 在2010年,甚至有传言说可能会达到10,000个. 没有人知道所有这些排名因素,但是我们确实知道其中一些. 怎么样?因为Google告诉我们,所以 ...

  5. 太空链SpaceChain OS:针对航天器设计、优化的操作系统

    点击上方 "蓝色字" 可关注我们! 编辑:铅笔盒   转载自太空链官方微信公众号 太空链目前正在开发SpaceChain OS,一款针对航天器设计.优化的操作系统. 由于航天技术的 ...

  6. 淘宝店铺优化中影响商品排名的几个必看因素

    淘宝店铺优化中影响商品排名的几个必看因素 影响商品搜索权重的因素有很多,除了之前讲到的最基本的5大相关性之外,还有很多细节方面的因素,如是否加入橱窗推荐.是否参加了消保.是否添加了淘宝标签等.这些因素 ...

  7. 产品网络推广方案浅谈网站的相关性对优化的影响!

    一般网站在做产品网络推广方案优化的时候,都会给网站进行相应的内容维护,不断的做强做好内容基础,才能逐渐给网站吸到更多好感,有助于网站排名提升,那么对于内容相关性会对网站优化有哪些影响呢?下面产品网络推 ...

  8. 阿里云PyODPS 0.7.18发布,针对聚合函数进行优化同时新增对Python 3.7支持

    近日,阿里云发布PyODPS 0.7.18,主要是针对聚合函数进行优化同时新增对Python 3.7支持. PyODPS是MaxCompute的Python版本的SDK,SDK的意思非常广泛,辅助开发 ...

  9. 栈空间不够会报错吗_网站更换域名和空间会对优化有影响吗?

    从一个网站的角度来说,更换域名,基本上很少会更换,一般是企业的名称变更.业务变更以及有其他纠纷等情况才会更换域名.假如旧的域名不再使用,就一定要把原来的域名301永久重定向与新的域名上,告诉搜索引擎, ...

最新文章

  1. tomcat通过apr配置https
  2. CSS 设计模式一 元素
  3. 数据结构学习笔记(一):链表(linked list)
  4. spotify音乐下载_使用Python和R对音乐进行聚类以在Spotify上创建播放列表。
  5. 【学习笔记】网络层——IPv6:地址表示、IPv4的对比、IPv4过渡到IPv6、基本地址类型等
  6. 11_less中的条件判断
  7. java读取照片信息 获取照片拍摄时的经纬度
  8. Vue.js菜鸟教程自学(一)
  9. python贴吧签到-百度贴吧签到脚本
  10. vs2017 安装Qt VS Tools ,新建项目没有Qt GUI Application选项 ,解决方法
  11. 外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL的区别
  12. css中子元素设置margin-top会影响到父元素
  13. 认知升级三部曲(深度好文)
  14. zookeeper学习笔记(一)--快速入门与集群部署
  15. 初学者在VMware上搭建自己的CentOS8
  16. MathType完美兼容Word 2019 最详细的安装配置教程转载
  17. SessionFactory在Hibernate中的作用
  18. JDK1.8下载与安装完整教程
  19. 动画蒙太奇(开火需要循环播放)
  20. 裸函数 __declspec(naked),C语言是怎么变成汇编的,用裸函数加汇编实现一个最简单的加法函数

热门文章

  1. 人名和成绩一起排序_不同工作表中的数据表排序各异,如何用Excel数据透视表汇总?...
  2. AIX学习笔记-第一天简介
  3. CodeForces 468 CHack it!
  4. SoftWater——SDN+UnderWater系列论文一
  5. HDU 4747 Mex【线段树上二分+扫描线】
  6. 听说下雨天,子序列和孤单的你更配哦~
  7. 利用strut2标签自动生成form前端验证代码
  8. kafka整合ldap权限管理
  9. Oracle数据库安装Version12c
  10. 怎么批量在数字里加入网页_手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇