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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: 第十七章——配置SQLServer(3)——配置“对即时负载的优化” 前言:        在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中。
原文: 第十七章——配置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


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
10月前
|
SQL 数据库 Windows
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
在配置SQL server 2014时出现“附加数据库时出错。有关详情信息请单机“消息”列中的超链接”问题如何解决
130 0
QGS
|
SQL 编译器 数据库连接
Centos7配置ODBC连接SQL server数据库
yum install unixODBC unixODBC-devel 如有错误请指正,谢谢
QGS
394 0
|
数据可视化 jenkins 关系型数据库
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
519 0
docker使用Portainer工具,配置服务模板可快速搭建SQLserver2019服务
|
SQL 数据库 索引
SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
SQLServer没创建一个查询,都相当于创建一个查询会话,在不同的查询分析器里面进行的查询操作,可能会影响别的查询会话。比较典型的一个例子,如果你正在使用事务执行某一张表的插入或者操作而没有正确关闭事务的情况下,会造成别的会话针对该数据表的查
SQLServer优化:SQLServer中NOLOCK关键字的用法介绍
|
SQL Java 数据库连接
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
293 0
mybatis学习(11): sql server配置管理器请求失败或服务未及时响应
|
SQL 存储 负载均衡
SQL Server 高可用性(八)负载平衡
高可用与负载平衡是两种不同的技术,却经常被混淆。
491 1
SQL Server 高可用性(八)负载平衡
|
数据库
SQLServer数据库F5负载问题
目前在用F5给数据库负载遇到的一个问题,给数据库负载(此处不涉及读写分离的问题,因为是一对一的负载即pool memeber只有一个)根据客户的要求给数据库负载采用七层的standerd模式,在TCP协议中,发现VS(标准模式的全端口配置)始终没有办法命中流量,当时网络是没问题的,长ping没有问题。
1392 0
|
SQL C# 数据库
C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大
原文:C# 编写的SqlServer 数据库自动备份服务,带配置,功能强大 数据库自动备份服务,带配置,还算可以吧 周末抽时间,编写了一个这样的工具,可以让,对数据库不了解或不熟悉的人,直接学会使用备份,省时省力,同样,我也将一份,通过脚本进行备份的,也奉献上来, 通过sql脚本进行数据库备份...
1360 0