3. Max Server Memory的值,就是SQL Server内存使用量的最大值。超过这个值就不正常
Max Server Memory这个值应该是Buffer Pool的上限(此点针对SQL Server 2005/2008而言,对于SQL Server 2012内存管理发生了非常大的变化),而不是SQL Server所有内存使用的上限。由于SQL Server 内存的使用包括Buffer Pool和MemToLeave,所以SQL Server实际内存使用量一定会比Max Server Memory要大但是在正常情况下SQL Server MemToLeave的使用会远小于Buffer Pool的使用,控制好Buffer Pool,就基木控制住了SQL Server的整体内存使用量
(注:建议无论内存是否存在压力都要合理的设置最大内存,PS:我也曾经被使用的内存超过设置的Max Server Memory吓了一跳)
4. SQL Server的内存使用总量,就是性能监视器里面的SQL Server:Memory Manager一Total Server Memory的值
性能监视器里面与SQL Server相关的counter,都是SQL Server自己负责收集的。从SQL Server 2005以后,SQL整合了所有的内存申请,让它们使用同一的接口。所以SQL Server对自己申请的内存数量,是了如指掌的,但问题是,在SQL Server进程里运行的代码不都是SQL Server自己的代码。对第三方的代码,SQL Server是不知道它们申请了多少内存的。
SQLServer:Memory Manager - Total Server Memory的值,是SQL Server自己的代码申请的内存空间大小。真正SQL Server进程申请的空间值,会比这个值大一些。(具体大多少和MemToLeave的大小有关系)
如果SQL Server没有开启AWE,SQL Server进程申请的逻辑内存数和物理内存数可以由Process下的Private Bytes和Working Set看出。这两个值会包含所有的内存支出,包括SQL自己的代码和第三方的代码。
如果SQL Server开启了AWE,问题就比较尴尬了。因为Windows没有办法正确判断出一个使用了AWE 内存的进程,究竟总共用了多少内存。我们只能借助SQLServer:Memory Manager一Total Server Memory来判断SQL Server的Buffer Pool使用量。至于SQL Server自己申请的内存总数(Buffer Pool + MemToLeave ),可以通过查询和内存相关的DMV计算出来,但第三方的代码申请的内存,就很难做精确计算了
5.当系统有内存压力的时候,SQL Server总是会自动释放内存
默认情况下,SQL Server的确会在系统有内存压力的时候自动释放内存但是有个例外:SQL Server启动时会试图做“Lock Page In Memory”的动作。如果启动账号有这个权限,动作就会成功。那么当同一台服务器上的其他应用程序需要内存的时候,SQL Server很可能不会释放内存。所以在这种情况下,建议SQL Server设置Max Server Memory上限。
(注:Lock Page In Memory很多资料上写到SQL的内存不会被释放了,但实际情况中,当操作系统感觉到压力一样会把SQL的内存释放掉,也是错误理解6的由来)
6. SQL Server有办法将自己的内存绑定在物理内存里
SQL Server的确想通过Lock Page In Memory的方法达到这个目的。但是,作为一个用户态为主的应用程序,它还是会受限于核心态。如果核心态里发出内存要求,SQL Server就会被迫把自己的内存释放出来。
7.增加MemToLeave的大小可以提高SQL Server的性能
在32位的SQL Server上,默认MemToLeave是256 MB+0.5 MB x ( Max Thread数目)。如果MemToLeave 用完了,SQL Server的一些重要功能就不能进行,甚至新的连接都建立不起来所以一些对MemToLeave需求比较大的SQL Server,例如,一些经常运行Linked Server分布式查询的SQL Server,或者是一些运行CLR,Extended Stored Procedur的SQL Server,可能不得不再加一些MemToLeave空间。这可以使用SQL Server的
一个启动参数一g完成。例如,如果想把MemToLeave设成512 MB+0.5 MB x ( Max Thread数目),可以加启动参数一g512。