浅谈SQL Server的内存管理

一:计算机存储的概述

对于计算机来说,存储体系是分层级的。离CPU越近的地方速度愉快,但容量越小(如图1所示)。比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘。但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级。比如硬盘通常要比同时代的内存大一个数量级

 

二:SQL Server使用内存的特点及何使用内存

SQL Server存储引擎本身是一个Windows下的进程,所以SQL Server使用内存和其它Windows进程一样,都需要向Windows申请内存。从Windows申请到内存之后,SQL Server使用内存粗略可以分为两部分:缓冲池内存(数据页和空闲页),非缓冲内存(线程,DLL,链接服务器等)。而缓冲池内存占据了SQL Server的大部分内存使用。缓冲池所占内存也就是图2最大最小内存所设置的,因此sqlservr.exe所占的内存有可能会大于上图中所设置的最大内存

还有一点是,SQL Server使用内存的特点是:有多少用多少,并且用了以后不释放(除非收到Windows内存压力的通知,具体SQL Server能够使用多少内存是由以下几个因素决定的:

  1.物理内存的大小

  2.所安装Windows版本对于内存的限制(比如windows server 2008标准版限制最大内存只能使用32GB)

  3.SQL Server是32位或64位

SQL Server OS的三层内存分配

 

三:SQL Server的Buffer Poll

  1. Buffer Poll:的作用时缓冲数据页,使得未来读取数据时减少对磁盘的访问。 
  2.  这个Buffer Pool这部分就是图2中设置最大最小服务器内存所占用的空间
  3. 这个最小值并不意味着SQL Server启动时就能占用这么多内存,而是SQL Server Buffer Pool的使用一旦超过这个值
  4. ,就不会再进行释放了 

在SQL Server实例启动时,Buffer Pool所保留的VAS地址空间取决于多个因素:包括实际的物理内存和SQL Server是32位或是64位(这个限制32位是4G,还要划一半给Windows和减去MemToLeave空间),而对于实际上SQL Server所使用的物理内存,可以通过如下语句查看

  1. select  
  2.     ISNULL(DB_NAME(database_id),'ResourceDb') AS DatabaseName,CAST(COUNT(row_count) *8.0/(1024.0) AS DECIMAL(28,2) AS[Size (MB)] 
  3.     from sys.dm_os_buffer_descriptiors group by database_id order by DatabaseName 
  4. Buffer Pool会按照需要不断的提出内存申请。Buffer Pool如果需要,Buffer Pool会不断消耗内存,直到Windows通知SQL Server内存过低时,Buffer Pool才有可能释放内存,否则Buffer Pool占据了内存不会释放。

      另外值得注意的一点是,Buffer Pool所分配的页面和SQL Server OS页面大小是一致的,也就是8192字节,当SQL Server其它部分需要向”Buffer Pool”借内存时,也只能按照8k为单位借,并且这部分内存在物理内存中是不连续的,这听上去像是Buffer Pool内存管理自成体系,可以这么理解,因为Buffer Pool 不使用任何SQL Server的page allocator,而直接使用virtual或AWE SQLOS's的接口

原文链接:http://database.chinaunix.net/a2012/0831/1392/000001392031_1.shtml