优化SQL数据库的内存占用之执行缓存_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

优化SQL数据库的内存占用之执行缓存

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:占用执行内存数据库
黑客防线网安网讯:在论坛上常见有朋友抱怨,说SQL Server太吃内存了。这里笔者根据经验简单介绍一下内存相关的调优知识。首先说明一下SQL Server内存占用由哪几部分组成。SQL Server占用的内存主要由三部分组...

在论坛上常见有朋友抱怨SQL Server太吃内存了这里笔者根据经验简单介绍一下内存相关的调优知识首先说明一下SQL Server内存占用由哪几部分组成。SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer)、执行缓存(Procedure Cache)、以及SQL Server引擎程序。SQL Server引擎程序所占用缓存一般相对变化不大则我们进行内存调优的主要着眼点在数据缓存和执行缓存的控制上。本文主要介绍一下执行缓存的调优。数据缓存的调优将在另外的文章中介绍。

对于减少执行缓存的占用,主要可以通过使用参数化查询减少内存占用。

1、使用参数化查询减少执行缓存占用

我们通过如下例子来说明一下使用参数化查询对缓存占用的影响。为方便试验,我们使用了一台没有其它负载的SQL Server进行如下实验。

下面的脚本循环执行一个简单的查询,共执行10000次。
 
首先,我们清空一下SQL Server已经占用的缓存:
dbcc freeproccache
 
然后,执行脚本:
DECLARE @t datetime
SET @t = getdate()
SET NOCOUNT ON
DECLARE @i INT, @count INT, @sql nvarchar(4000)
 
SET @i = 20000
WHILE @i <= 30000
BEGIN
    SET @sql = 'SELECT @count=count(*) FROM P_Order WHERE MobileNo = ' + cast( @i as varchar(10) )
    EXEC sp_executesql @sql ,N'@count INT OUTPUT', @count OUTPUT
    SET @i = @i + 1
END
PRINT DATEDIFF( second, @t, current_timestamp )
 
输出:
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
11
 
使用了11秒完成10000次查询。

我们看一下SQL Server缓存中所占用的查询计划:

Select Count(*) CNT,sum(size_in_bytes) TotalSize
From sys.dm_exec_cached_plans
 
查询结果:共有2628条执行计划缓存在SQL Server中。它们所占用的缓存达到:

92172288字节 = 90012KB = 87 MB。
 
我们也可以使用dbcc memorystatus 命令来检查SQL Server的执行缓存和数据缓存占用。

执行结果如下:

执行缓存占用了90088KB,有2629个查询计划在缓存里,有1489页空闲内存(每页8KB)可以被数据缓存和其他请求所使用。
 
我们现在修改一下前面的脚本,然后重新执行一下dbcc freeproccache。再执行一遍修改后的脚本:

DECLARE @t datetime
SET @t = getdate()
SET NOCOUNT ON
DECLARE @i INT, @count INT, @sql nvarchar(4000)
 
SET @i = 20000
WHILE @i <= 30000
BEGIN
    SET @sql = 'select @count=count(*) FROM P_Order WHERE MobileNo = @i'
    EXEC sp_executesql @sql, N'@count int output, @i int', @count OUTPUT, @i
    SET @i = @i + 1
END
PRINT DATEDIFF( second, @t, current_timestamp )
 
输出:
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
1
即这次只用1秒钟即完成了10000次查询。
我们再看一下sys.dm_exec_cached_plans中的查询计划:
Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans
 
查询结果:共有4条执行计划被缓存。它们共占用内存: 172032字节 = 168KB。
如果执行dbcc memorystatus,则得到结果:

有12875页空闲内存(每页8KB)可以被数据缓存所使用。
 
到这里,我们已经看到了一个反差相当明显的结果。在现实中,这个例子中的前者,正是经常被使用的一种执行SQL脚本的方式(例如:在程序中通过合并字符串方式拼成一条SQL语句,然后通过ADO.NET或者ADO方式传入SQL Server执行)。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-9685-1.html
网站维护教程更新时间:2012-03-21 02:24:03  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer