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

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

前言:

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

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

准备工作:

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

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

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
GO

结果如下:

2、 清空缓存和缓冲池:

DBCC FREEPROCCACHE
GO

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

步骤:

1、 执行下面语句:

USE AdventureWorks
GO
SELECT  *
FROM    Sales.SalesOrderDetail
WHERE   SalesOrderDetailID = 43659
GO

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

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
GO

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

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

 EXEC sp_configure ‘optimize for ad hoc workloads‘, 1
RECONFIGURE
GO

5、 然后再次清空缓存:

DBCC FREEPROCCACHE
GO

6、 再次执行语句:

USE AdventureWorks
GO
SELECT  *
FROM    Sales.SalesOrderDetail
WHERE   SalesOrderDetailID = 43659
GO

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

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
        AND ST.text LIKE ‘%SELECT  *  FROM    Sales.SalesOrderDetail  WHERE   SalesOrderDetailID = 43659  %‘
        AND CP.cacheobjtype = ‘Compiled Plan‘
GO

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

USE AdventureWorks
GO
SELECT  *
FROM    Sales.SalesOrderDetail
WHERE   SalesOrderDetailID = 43659
GO

9、 使用以下查询检查:

SELECT  CP.usecounts AS CountOfQueryExecution ,
        CP.cacheobjtype AS CacheObjectType ,
        CP.objtype AS ObjectType ,
        ST.text AS QueryText
FROM    sys.dm_exec_cached_plans AS CP
        CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS ST
WHERE   CP.usecounts > 0
        AND ST.text LIKE ‘%SELECT  *  FROM    Sales.SalesOrderDetail  WHERE   SalesOrderDetailID = 43659  %‘
        AND CP.cacheobjtype = ‘Compiled Plan‘
GO

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

分析:

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

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

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

SELECT  SUM(size_in_bytes) AS TotalByteConsumedByAdHoc
FROM    sys.dm_exec_cached_plans
WHERE   objtype = ‘Adhoc‘
        AND usecounts = 1
时间: 2024-08-19 23:33:54

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

配置对即时负载的优化

前言: 在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中.在很多时候,我们会执行一些简单的程序,仅仅执行一次,而为这些查询创建存储过程是非常浪费内存资源的.由于内存不足,可能会导致你的缓存溢出,从而影响性能.在2005之前,这是一个大问题,为了纠正这个问题.微软在SQLServer 2008中引入了对即时查询负载的优化功能.这个功能在2012也依旧可用.是基于实例级别的. 很多开发人员直接在生产环境运行和测试查询,如果没有得到期望的结果,会更改查询然后再次

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

原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言: SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建议使用默认配置,但是基于不同的服务器.不同负载的系统和你的用法,更改配置可能会给你的性能带来好处.在32位和64位系统中,sp_configure会有一些差异. 我们经常见到SQLServer所在的服务器上还包含了如IIS.文件服务器或者域控制器这些服务或者功能.这些会影响你的性能甚至对正常运作有阻

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

原文:第十七章--配置SQLServer(4)--优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServer ManagementStudio的图形化界面实现. 准备工作: 为了查看SQLServer当前实例的配置,也可以使用下列查询来实现: SELECT * FROM sys.configurations ORDER BY name 下面是本机的结果: 步骤: 1. 执行下面语句,以便看到实例级别的

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

原文:第十七章--配置SQLServer(2)--32位和64位系统中的内存配置 前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE来限制内存.但是,在SQLServer2012以后,这个选项将被弃用,所以不能使用这种方式来控制32位实例的虚拟地址空间.如果你服务器上有很多内存,就只能升级到64位系统.下面是微软给出的内存限制: 虽然2012以后已经弃用AWE,但是了解一下32位系统如何使用AWE(Address Windowi

第9章 高级 SQL Server 配置

第9章  高级 SQL Server 配置 9.1  使用sp_config 9.1.1  执行查询 9.1.2  配置基本参数 9.1.3  配置高级参数 9.2  管理员专用连接 9.3  使用SQLCMD

SQL - 配置SQLServer 使其可以远程访问

环境: SQL Server2008 R2 SQL Server Management Studio 今天测试部署项目的时候,发现不能远程访问SQL Server.具体情形就是在Management Studio连入DB的时候,Server name 输入./Instance ,没有任何问题.输入ip地址\SQLInstance的时候.就连接不上了. 如何远程连接,网上有大把的教程. 总结出来有3个原因. 在SQL Server Management Studio本地登陆后,右击属性 1. 选择

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

2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之--03PDF文档下载 第二章 Jenkins安装与配置 2 Jenkins安装 在最简单的情况下,Jenkins 只需要两个步骤: 1.下载最新的版本(一个 WAR 文件).Jenkins官方网址: http://Jenkins-ci.org/ 2.运行 java -jar jenkins.war 注意:

第二章Maven安装与配置2

Maven安装目录分析 ? bin:含有mvn运行的脚本 ? boot:含有plexus-classworlds类加载器框架 ? conf:含有settings.xml配置文件 ? lib:含有Maven运行时所需要的java类库 ? LICENSE.txt, NOTICE.txt, README.txt针对Maven版本,第三方软件等简要介绍 初始配置 ?设置MAVEN_HOME环境变量 升级时只需要下载最新版本,解压缩后重新设置MAVEN_HOME环境变量即可 ? 设置MAVEN_OPTS环

第二章Maven安装与配置

安装Maven ? 确认jdk是否已安装? ? 下载Maven 地址:http://maven.apache.org/download.html 版本:Maven3.0 ? 安装Maven 检查jdk安装的情况(要1.6版本): Echo %JAVA_HOME% Java -version 对apache-maven-3.0.3-bin.zip进行解压缩,解压到如下目录(解压目录最好不要有中文字) 设置系统环境变量,MAVEN_HOME 设置环境变量Path,将%MAVEN_HOME%\bin加