我们知道在isql中可以用sp_configurememory去看SQLServer目前使用的内存这个数字单位为page每一page为k当memory的值被修改后重新启动SQL Server时新的值才能生效当然SQL Server内存与机器内存有一定的比例关系 Server的内存太小会影响Server性能甚至无法启动内存太大SQL Server也不能启动所以了解SQL Server内存是如何分配的对于正确地调整SQL Server内存的数值保证Server最有效地运行会有很大的帮助
一内存使用
操作系统及其他运行程序所占内存
SOL Server执行代码所占内存
Kernl&Server 结构所占内存
如user connectionsdevicesopen databasesopen objectslocksnetwork packet buffersextent i/o buffers等
Procedure cache
Data Cache
二内存分配举例(以 SQL SERVER 版本为参考)
由上表可知机器内存中去掉操作系统及其他程序所需的内存剩下的内存就可以分配给SQL Server
假设SQL Server内存值为 page即 *k=MB SQL Server执行代码所占内存对于不同平台不同版本SQL Server执行代码大小不同但对某种固定的平台及版本大小是固定的大约在MB~MB用dbcc memusage可以观察到执行代码 的大小我们假设为MB则剩下内存( )=MB此外静态SQL Server额外还需要一些保留内存(此值不因用户修改configure参数值而改变)大概在~MB此例中我们假设为MB下一步SQL Server分配用户定义的configure参数所需的内存如下表
note:
stack size default k
影响内存的参数还有DefaultNetworkPacketSizeextenti/obuffers等此处忽略此时SQL Server剩下的分配给cache的总内存为()=MB
在Cache中procedure Cache所占内存依赖于sp_configure中procedure Cache参数值缺省为即占总Cache 的%那么Cache中的%为data Cache此例中我们设procedure Cache仍为
data cache =(MB) *
procedure Cache =(MB) *
Data Cache用于从database中读取页信息如:data log index pages procedure Cache用于存放compiled objects如 stored procedurestriggers rules同时处理querycursor等
Procedure Cache&Data Cache不能太小否则影响使用可以通过dbce memusage 查询使Procedure Cache有足够大小调整好Data Cache与Procedure Cache的比例此外我们还可以从SQL Server Errorlog中查看到Cache总内存空间情况
Server:Number of buffers in buffer cache:
Server:Number of proc bufferrs allocated:
Server:Number of blocks left for proc headers:
第一条信息表示用于data Cache的页数 pages
第二条信息表示用于procedure Cache的页数 pages
第三条信息表示procedure Cache中一次最多能有个已编译过的objects
我们还应知道如果default network packet size参数变化了则分配给network packet的总内存为 user connections * *default network packet size 缺省值为 * *= bytes若增加default network packet size值应考虑SQL Server内存所剩空间特别是data &procedure Cache的需要
三使用dbcc memusage命令
dbcc memusage命令用于显示SQL Serrver内存使用信息也是查看SQL Server执行代码大小的唯一途径
>dbcc traceon ()
>go
>dbcc memusage
>go
>dbcc traceoff ()
>go
信息中code size表示SQL Server执行代码大小
四不同SQL Server版本的内存要求
educitycn/img_///gif>