SQL Server 内存优化之即席式工作负荷优化_Panda-CSDN博客_sql server 2005 针对即席工作进行优化

来源: SQL Server 内存优化之即席式工作负荷优化_Panda-CSDN博客_sql server 2005 针对即席工作进行优化

SQL Server中执行代码时,代码会生成一个哈希值,并使用哈希值确认计划的重用,如果执行一个存储过程,存储过程的名称会生成一个哈希值,后续的每一个存储过程调用不管使用的参数是否与之前的相同,都会重用该计划。

如果运行除了存储过程以外的同样的代码啊(也就是即席T-SQL),包含代码中所有文字的整段代码将会生成哈希值。当改变了代码中的任何文字再次执行语句,新的哈希值与之前的就不同乐,因此会生成一个新的执行计划。

这种情况会导致被称为计划缓存膨胀(plan cache bloat)的场景,既可能有成千上万的即席查询的执行计划被生成和缓存,虽然从根本上说代码时相同的,单这些计划的使用次数只有1。理想的解决方案是用时存储过程或函数,或讲所有即席T-SQL都进行参数化,但是往往无法实现。

针对即席工作负荷进行优化(Optimize for Ad-hoc Workloads)选项

启用这个选项是,当一段即席T-SQL第一次执行时,SQL Server将执行计划的存根进行缓存,而不是完整计划。如果SQL Server随后尝试重用改计划,执行计划将再次生成,但这次执行计划全部被缓存,这避免了成千上万地一次性使用的执行计划在缓存中占用宝贵空间。

例如,显示计划缓存大小:

— Single use adhoc plans
select count(*) as ‘Number of Plans’,
sum(cast(size_in_bytes as bigint))/1024/1024 as ‘Plan Cache Size(MB)’
from sys.dm_exec_cached_plans

结果
Number of Plans Plan Cache Size(MB)
————— ——————–
2 0
显示计划缓存中各缓存对象类型的大小:

— Cache size by object type
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

结果
Cached Object Type Number of Plans Plan Cache Size (MB) Avg Use Count
——————– ————— ——————– ————-
View 1 0 6
Adhoc 3 2 1
其中Adhoc为即席计划,Plan Cache Size(MB)为大小,Avg User Count 为平均使用次数

显示即席计划缓存中,只使用了一次的执行计划:

— Single use adhoc plans
SELECT count(*) AS ‘Number of Plans’,
sum(cast(size_in_bytes AS BIGINT))/1024/1024 AS ‘Plan Cache Size (MB)’
FROM sys.dm_exec_cached_plans
WHERE usecounts = 1
AND objtype = ‘adhoc’

结果
Number of Plans Plan Cache Size (MB)
————— ——————–
1 0
总结:针对即席工作负荷进行优化的选中能够确保不缓存不能重复使用的计划,可以节省服务器内存,并且仅影响即席计划,建议在所有SQL Server安装中默认都打开这个选项。
————————————————
版权声明:本文为CSDN博主「gulugulu。o0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28617547/article/details/93262623

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏