易截截图软件、单文件、免安装、纯绿色、仅160KB

执行缓存以优化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 Server中的行列倒置技巧

行列倒置在sql server中是一种很常见的技巧,在做应用系统的时候,经常需要做一些统计功能避免不了使用行列倒置这个技巧,我小小的做了一下总结:
第一种:sql server 2000中使用case进行行列倒置
create table RowCellConvertTest
(
 grade varchar(50),
 sex varchar(50),
 studentCount int
)
......

SQL插入语句(INSERT INTO )

INSERT INTO
 tableName ( columnName1, columnName2, columnName3, columnName4)
VALUES      (  '45', '西藏办',  TO_Date( '2010-03-10 12:00:00', 'YYYY-MM-DD HH24:MI:SS'), NULL,);
commit; ......

SQL跨用户取进行数据库操作(这里用到了left join)

select ks.login_name,ks.exam_name,ks.start_time,ks.end_time,cj.score
from (
     select u.user_id,u.login_name,e.* from  cphrms.EXAM_USER eu, cphrms.users u, cphrms.exam_info e
     where eu.user_id = u.user_id and eu.exam_id = e.exam_id
) ks
left ......

SQL高级应用 Garin Zhang

追加:row_number, rank, dese_rank, ntile
1. row_number: 为查询出来的每一行记录生成一个序号。
SELECT row_number() OVER(ORDER BY field) AS row_n
from tablename;
分页查询:
with t_towtable
as (select row_number over(order by field1) as row_number from tb)
select * from t_rowtable where row_numbe ......

【转】关于"递归树形查询SQL"的好帖

-----------------------------------------------------------------------------------------------------------------------
create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null  , '广东省')
insert into tb values('002' , '001' , '广州市')
insert i ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号