优化SQL Server的内存占用之执行缓存

首先说明一下SQL Server内存占用由哪几部分组成。SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer)、执行缓存(Procedure Cache)、以及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 &lt;= 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的执行缓存和数据缓存占用。 执行结果如下: <img alt src="http://img.558idc.com/uploadfile/allimg/210405/11540HU3-0.gif" border="0">