执行缓存以优化SQL Server的内存占用
作者:superhasty
2007-11-29
在论坛上常见有朋友抱怨,说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。
 
相关文档:
SQL Servertimestamp数据类型与时间和日期无关。SQL Servertimestamp是二进制数字,它表明数据库中数据修改发生的相对顺序。实现timestamp数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是timest ......
一 系统预定义错误代码
SQL Server 有3831个预定义错误代码,由master.dbo.sysmessages表维护。每一个错误代码都有相应的级别和描述。
错误定义的级别从0到25。20以上的错误代表重大错误,通常意味着该错误会导致存储进程立刻终止,并且所有的客户连接都要重新初始化。
非关键性错误只是禁止掉当前运行的程序行,并继 ......
Microsoft SQL Server 2008 对 T-SQL 语言进行了进一步增强。为了让开发人员尽快了解这些变化,我们针对 2007 年 6 月 CTP 版本的 SQL Server 2008 中的 T-SQL 语言的新增功能进行了分析和尝试。本文描述自 SQL Server 2008 CTP1 以来这些语言增强和变化。
本文包含如下内容:
· T-SQL 行构造器
&mid ......
使用 Microsoft SQL Server 安装向导的"实例名"页,可指定创建默认实例还是创建 SQL Server Express 命名实例。除非您选择默认实例,否则 SQL Server Express 将始终安装命名实例 (SQLExpress)。此行为与 SQL Server 2005 不同,后者在未选择命名实例的情况下,将始终安装默认实例。
选项
选项
说明
默认实例 ......
SELECT g.rid, room_no, planed_count,cc from
(SELECT rid,room_no, planed_count from YC_HOTEL_ROOM_T ) r
left join
(SELECT rid,count(*) cc from YC_GUEST_INFO_T group by rid ) g
ON r.rid = g.rid WHERE planed_ ......