博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3 .6 .5 优化Ad-Hoc工作负载
阅读量:6722 次
发布时间:2019-06-25

本文共 1309 字,大约阅读时间需要 4 分钟。

执行计划生成后会存储在plan cache中,以便重用,如果计划缓存从来都没有被重用 过,将会造成内存资源的浪费,这有可能是由于非参数化的Ad-hoc (即席查询)引起的。 当执行代码时,会产生一个hash值,用于匹配计划缓存中的hash值,相同的hash值代表 语句是相同的。如果执行一个存储过程,会按照存储过程名来创建hash值,如果在存储过 程之外执行代码(Ad-hoc T-SQL),那么hash值会根据整个语句产生。你的代码有一点点字 面上的改变,都会产生不同的hash值,导致计划无法重用。当有大量Ad-hoc执行时,会 导致计划缓存的膨胀。

针对这类问题,可以考虑使用存储过程、函数或者参数化Ad-hoc,但是有时候的确没 有办法,必须使用非参数化的Ad-hoc。从 SQL Server 2008开始,引人了一个“针对即席 工作负荷进行优化”的选项,如图3-9所示。

找到该选项的具体步骤是:右键实例,然后选择“属性",再选择“高级",之后把图3-9

箭头处的False改成True。下面是针对该选项的官方解释:

 

“针对即席工作负荷进行优化”选项用于提高包含许多一次性临时批处理的工作负荷计

划缓存的效率。如果该选项设置为True,则数据库引擎将在首次编译批处理时在计划缓存 中存储一个编译的小计划存根,而不是存储完全编译的计划。在这种情况下,不会让未重

复使用的编译计划填充计划缓存,从而有助于缓解内存压力。

编译的计划存根使数据库引擎能够识别此临时批处理以前已经编译过,但只存储了编

译计划存根,因此当再次调用(编译或执行)此批处理时,数据库引擎会对此批处理进行编

译,从计划缓存中删除编译计划存根并将完全编译的计划添加到计划缓存中。

“针对即席工作负荷进行优化”设置为1 只会影响新计划,而已在计划缓存中的计

划不受影响。

编译计划存根是sys.dm_exec_cached_plans目录视图显示的cacheobjtype之一它具有

唯一的SQL句柄和计划句柄。编译计划存根没有与其关联的执行计划,并且查询计划句柄

不会返回XML显示计划。

可以用下面的脚本来查看缓存对象的对应内存数。

SELECT objtype AS 'Cached Object Type * , COUNT(*) AS 'Number of Plans', SUM(CAST{size_in_bytes AS BIGINT)) / 1024 / 1024 AS 'Plan Cache Size (MB)', AVG(usecounts) AS 'Avg Use Count * FROM sys.dm_exec_cached_plans GROUP BY objtype

在笔者计算机上的结果如图3-10所示。

 

 在 没 有 开 启 上 面 选 项 的 系 统 中 ,Ad-hoc通 常 是 内 存 占 用 最 多 的 部 分 。所 以 从 SQL Server 2008开 始 ,建议开启这个选项。

转载于:https://www.cnblogs.com/zhouwansheng/p/9243933.html

你可能感兴趣的文章
转: Beautiful Numbers (费马小定理)
查看>>
Python 匿名函数
查看>>
(转)分布式中使用Redis实现Session共享(一)
查看>>
知识点疑问
查看>>
【UbuntuPhone开发实战】工具篇--Nexus4 booter unlock,获取root权限,刷CM10和刷Ubuntu...
查看>>
汇编语言编辑、汇编、连接、运行的全过程
查看>>
the shortcuts used for linux ternimal
查看>>
PHP字符编码问题之GB2312 VS UTF-8
查看>>
JAVA去除HTML标签
查看>>
关于iOS 11和iPhone X的一些适配问题及解决方案
查看>>
[Noip2016]愤怒的小鸟(状压DP)
查看>>
dyld:Library not loaded
查看>>
【算法专题】后缀自动机SAM
查看>>
为你的JavaScript库提供插件能力
查看>>
Flutter学习之Dart语言基础(关键字)
查看>>
applicationContext.txt
查看>>
一、Java语言基础(2)_类型和运算——数据类型和分类
查看>>
聊聊今年的互联网环境,Android开发者该有哪些思考?
查看>>
Xamarin控件使用之GridView
查看>>
第十一 html基础
查看>>