针对即席工作负荷进行优化在SQL Server中的真正意义?

先来看MSDN中的解释:

“针对即席工作负荷进行优化”选项用于提高包含许多一次性临时批处理的工作负荷计划缓存效率如果该选项设置为 1,则数据库引擎将在首次编译批处理时在计划缓存中存储一个编译的小计划存根,而不是存储完全编译的计划。这种情况下不会让未重复使用的编译计划填充计划缓存,从而有助于缓解内存压力。
编译的计划存根使数据库引擎能够识别此临时批处理以前已经过编译,但只存储了编译计划存根,因此当再次调用(编译或执行)此批处理时,数据库引擎会对此批处理进行编译,从计划缓存中删除编译计划存根并将完全编译的计划添加到计划缓存中
将“针对即席工作负荷进行优化”设置为 1 只会影响新计划;已在计划缓存中的计划不受影响。
编译计划存根是 sys.dm_exec_cached_plans 目录视图显示的 cacheobjtype 之一。它具有唯一的 SQL 句柄和计划句柄。编译计划存根没有与其关联的执行计划,并且查询计划句柄不会返回 XML 显示计划。
 
对于它,我的个人理解:
 
在数据库的编译的执行计划缓存之前,会增加一个存根(可以理解为一个索引或者是筛选器)。当一个SQL语句第一次执行的时候,它并不会直接被存储到执行计划,之后再次被执行,才会被加入执行计划!也就是说,我们开发过程有意或无意中导致有些SQL只执行一次,那么利用开始这项功能,可以节省执行计划的缓存(节省内存),当然,这个是需要牺牲一些CPU(轻微)的性能的。
 
那么什么时候是只执行一次呢?
 
for (int i = 1; i <= 10000; i++)
{
    cmd = new SqlCommand(
    "SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = " + i.ToString(), cnn);
    SqlDataReader reader = cmd.ExecuteReader();
    reader.Close();
}
 
这个代码在循环里调用了10000次SELECT语句——使用硬编码参数值。使用硬编码参数值,SQL语句的哈希值总会不一样,因此SQL Server不能重用缓存的计划。作为副作用,这样的SQL就是上述提到的“有意或无意的导致SQL只执行一次”,你在计划缓存里存储了10000个不同的执行计划。
这个部分的内容引用自:http://www.cnblogs.com/woodytu/p/4749903.html
 
这个要不要启用?
 
我觉得要看你的实际情况,服务器到底是内存紧张还是CPU紧张?
因为绝大多数情况下,内存可能会是最大的瓶颈,所以这个功能大多数人都是建议开启的
 
评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址