原文:第十七章——配置SQLServer(3)——配置“对即时负载的优化”

前言:

在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中。在很多时候,我们会执行一些简单的程序,仅仅执行一次,而为这些查询创建存储过程是非常浪费内存资源的。由于内存不足,可能会导致你的缓存溢出,从而影响性能。在2005之前,这是一个大问题,为了纠正这个问题。微软在SQLServer 2008中引入了对即时查询负载的优化功能。这个功能在2012也依旧可用。是基于实例级别的。

很多开发人员直接在生产环境运行和测试查询,如果没有得到期望的结果,会更改查询然后再次执行,这会对过程缓存造成很大压力。所以尽量不要这样做。

准备工作:

在开始之前,在测试服务器清空缓存,但是切记不要在生产环境这样做:

1、 先看看有多少数据保存在缓存中:

  1. SELECT CP.usecounts AS CountOfQueryExecution ,
  2. CP.cacheobjtype AS CacheObjectType ,
  3. CP.objtype AS ObjectType ,
  4. ST.text AS QueryText
  5. FROM sys.dm_exec_cached_plans AS CP
  6. CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
  7. WHERE CP.usecounts > 0
  8. GO

结果如下:

2、 清空缓存和缓冲池:

  1. DBCC FREEPROCCACHE
  2. GO

3、 如果想检查是否清空成功,可以再次执行步骤1中的语句:

步骤:

1、 执行下面语句:

  1. USE AdventureWorks
  2. GO
  3. SELECT *
  4. FROM Sales.SalesOrderDetail
  5. WHERE SalesOrderDetailID = 43659
  6. GO

2、 检查在运行了上面语句后是否有计划缓存,再次执行之前查询计划缓存的语句:

  1. SELECT CP.usecounts AS CountOfQueryExecution ,
  2. CP.cacheobjtype AS CacheObjectType ,
  3. CP.objtype AS ObjectType ,
  4. ST.text AS QueryText
  5. FROM sys.dm_exec_cached_plans AS CP
  6. CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
  7. WHERE CP.usecounts > 0
  8. GO

3、 下面是结果,当然,也可以在where条件中用like来减少查找的数据量:也可以使用ctrl+alt+a来开启活动监视器来查找运行时间长的查询。

4、 现在来把Optimize for Ad hoc Workloads设为1:

  1. EXEC sp_configure 'optimize for ad hoc workloads', 1
  2. RECONFIGURE
  3. GO

5、 然后再次清空缓存:

  1. DBCC FREEPROCCACHE
  2. GO

6、 再次执行语句:

  1. USE AdventureWorks
  2. GO
  3. SELECT *
  4. FROM Sales.SalesOrderDetail
  5. WHERE SalesOrderDetailID = 43659
  6. GO

7、 可以执行下面的语句检查是否有新的缓存进入:

  1. SELECT CP.usecounts AS CountOfQueryExecution ,
  2. CP.cacheobjtype AS CacheObjectType ,
  3. CP.objtype AS ObjectType ,
  4. ST.text AS QueryText
  5. FROM sys.dm_exec_cached_plans AS CP
  6. CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
  7. WHERE CP.usecounts > 0
  8. AND ST.text LIKE '%SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = 43659 %'
  9. AND CP.cacheobjtype = 'Compiled Plan'
  10. GO

8、 你会发现里面没有数据,现在再次执行下面语句:

  1. USE AdventureWorks
  2. GO
  3. SELECT *
  4. FROM Sales.SalesOrderDetail
  5. WHERE SalesOrderDetailID = 43659
  6. GO

9、 使用以下查询检查:

  1. SELECT CP.usecounts AS CountOfQueryExecution ,
  2. CP.cacheobjtype AS CacheObjectType ,
  3. CP.objtype AS ObjectType ,
  4. ST.text AS QueryText
  5. FROM sys.dm_exec_cached_plans AS CP
  6. CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
  7. WHERE CP.usecounts > 0
  8. AND ST.text LIKE '%SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = 43659 %'
  9. AND CP.cacheobjtype = 'Compiled Plan'
  10. GO

10、这次就出现了下面的截图:

分析:

当新查询执行时,query_hash值会在内存中生成,而不是整个执行计划,当相同的查询第二次执行的时候,SQLServer会查找是否已经存在这个query_hash,如果不存在,执行计划将保存在缓存中。这样就使得仅执行一次的查询将不会保存执行计划到缓存中。所以强烈建议打开这个配置。这个配置不造成任何负面影响,但是可以节省计划缓存的空间。

一般情况下,当你执行查询,将会产生执行计划并保存在过程缓存中,所以当你执行步骤1的查询是,会看到服务器有很多计划缓存,但是当执行第六步后的查询是,就发现没有。对于即席查询,如果只执行一次,何必需要缓存呢?

有些系统的计划缓存达到GB以上,开启后可能减少一半空间。另外,如果你好奇即席查询占用了多少空间,可以使用下面的语句:

  1. SELECT SUM(size_in_bytes) AS TotalByteConsumedByAdHoc
  2. FROM sys.dm_exec_cached_plans
  3. WHERE objtype = 'Adhoc'
  4. AND usecounts = 1

第十七章——配置SQLServer(3)——配置“对即时负载的优化”的更多相关文章

  1. 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器

    原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言: SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建 ...

  2. 第十七章——配置SQLServer(4)——优化SQLServer实例的配置

    原文:第十七章--配置SQLServer(4)--优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServ ...

  3. 第十七章——配置SQLServer(2)——32位和64位系统中的内存配置

    原文:第十七章--配置SQLServer(2)--32位和64位系统中的内存配置 前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载

    在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新componen ...

  5. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

  6. SqlServer环境配置和卸载

    一.数据库简介 SQLServer环境配置 安装好数据库以后怎么启用sa账号,来访问数据库. 1.先用windows账号登录数据库. 2.启用windows身份验证方式和sql server身份验证方 ...

  7. Ubuntu下PHP开发配置(新增redis、sphinx、sqlserver相关配置)

    由于本人比较懒,所以一般都是用xampp的直接拿来改的…………(当然xampp中一般php版本都是比较新的用的过程中请大家注意哈,可能会和老版本冲突) 此次除了使用xampp外,还扩展了sphinx, ...

  8. asp.net MVC日志插件Log4Net学习笔记二:保存日志到sqlserver的配置

    1.写到sqlserver的配置: <!--保存到SQLSERVER数据库日志--> <log4net> <appender name="AdoNetAppen ...

  9. 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识

    第25章      DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...

随机推荐

  1. DEDE使用AJAX无刷新提交Form表单,PHP返回结果

    $query = "INSERT INTO `{$diy->table}` (`id`, `ifcheck` $addvar)  VALUES (NULL, 0 $addvalue); ...

  2. ThreadSafeClientConnManager的20个例子

    Java Code Examples for org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager The following are ...

  3. VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT

    VMware虚拟机上网络连接(network type)的三种模式--bridged.host-only.NAT VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换 ...

  4. TextBox自定义Mac输入框类

    using System.Windows.Controls; namespace test { public class MacTextBox : TextBox { private string _ ...

  5. Android他们控制的定义(一)

    培养自己的控制步骤定义: 1.要理解View作品  2. 分享到继承View子类 3. 要定义自己的View类添加属性  4. 绘制控件  5. 响应用户消息  6 .自己定义回调函数  一.View ...

  6. d3d纹理参数

    D3DTEXTURESTAGESTATETYPE 纹理状态定义了一个多层次的复杂的操作质感.一些采样工作状态设置顶点,有些组像素操作. 纹理层次状态可以快速保存并返回状态. typedef enum ...

  7. ORA-00913错误:PL/SQL: ORA-00913: too many values

    ORA-00913错误 描写叙述:PL/SQL: ORA-00913: too many values 目标:编写一个能够循环插入数据的脚本 操作过程: SQL> desc tcustmer N ...

  8. 探索Android该Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象. 主要应用是利用外部存储设备保存对象状 ...

  9. 重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口

    原文:重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (2 ...

  10. 重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画)

    原文:重新想象 Windows 8 Store Apps (20) - 动画: ThemeAnimation(主题动画) [源码下载] 重新想象 Windows 8 Store Apps (20) - ...