浅谈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
- Buffer Poll:的作用时缓冲数据页,使得未来读取数据时减少对磁盘的访问。
- 这个Buffer Pool这部分就是图2中设置最大最小服务器内存所占用的空间
- 这个最小值并不意味着SQL Server启动时就能占用这么多内存,而是SQL Server Buffer Pool的使用一旦超过这个值
- ,就不会再进行释放了
在SQL Server实例启动时,Buffer Pool所保留的VAS地址空间取决于多个因素:包括实际的物理内存和SQL Server是32位或是64位(这个限制32位是4G,还要划一半给Windows和减去MemToLeave空间),而对于实际上SQL Server所使用的物理内存,可以通过如下语句查看
- select
- ISNULL(DB_NAME(database_id),'ResourceDb') AS DatabaseName,CAST(COUNT(row_count) *8.0/(1024.0) AS DECIMAL(28,2) AS[Size (MB)]
- from sys.dm_os_buffer_descriptiors group by database_id order by DatabaseName
- 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的接口
转载于:https://blog.51cto.com/haicang/1123481