SQL Server是如何使用内存的

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

    还有一点是,SQL Server使用内存的特点是:有多少用多少,并且用了以后不释放(除非收到Windows内存压力的通知)。比如我所在公司的开发服务器,在几乎没有负载的时候来看内存使用,如图3所示。

 

    图3.SQL Server 进程的内存使用

    可以看到CPU在0负载的时候,内存却占据了13个G。这其实是在之前的使用SQL Server向Windows申请的内存一直没有释放所致。

    具体SQL Server能够使用多少内存是由以下几个因素决定的:

    1.物理内存的大小

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

    3.SQL Server是32位或64位

    4.如图2所示配置SQL Server对于内存的使用量

    5.SQL Server的版本(比如express版只能用1G内存)

 
SQL Server OS的三层内存分配

    SQL Server OS对于内存的分配分为三个层级,依赖关系如图4所示。

    图4.SQL Server OS内存依赖关系

Memory Node

    首先底层的是Memory Node,Memory Node的作用是使得分配内存由Windows移交到SQL Server OS层面执行。每个SQL Server实例通常都只拥有一个Memory Node,Memory Node的多寡只取决于NUMA构架的硬件配置。我们通过 DBCC MEMORYSTATUS  可以看到Memory Node的一些信息,如图5所示。

    图5.查看Memory Node信息