服务器的内存资源是有限的,windows服务器上面运行的SQLServer 的默认的服务器最大内存是2147483647MB,当然这个也不表示 Sqlserver霸占着这么多的内存,它是动态的,如果其他应用程序需要,也会释放内存。但是如果是使用这个默认值,就会一直处于内存满格的状态,看起来随时内存不足的样子。
其实一般情况下,SQLServer 的动态内存的管理是没什么问题的,但是由于服务器长期不关机释放资源,加上服务器的其他应用程序的运行,内存会越来越不够,最终会出现内存溢出的错误。如果我们不知道服务器最大内存该如何合理设置,那么就无法掌控服务器的内存。
我在百度上花了一天的时候寻找和了解内存以及服务器维护设置相关的资料,找到的结果并不理想,给出的数据库服务器最大内存配置值的计算公式也不具备合理性,只是DBA的经验得出的值。后面我归纳了比较合理的公式,希望对大家有所帮助。
设置最大内存的时候要考虑目前系统运行的所有应用以及当前服务器数据库占用的内存的大小。
参考设置的最大内存值公式:
参考设置的最大内存值(M) = 服务器总内存 - ( CurrUsedMemory - CurrDBMemory + ReserveMemoryForOtherApp )
其中:
CurrDBMemory :当前数据库已经使用的内存值,可以通过下面的sql查询出来
Go
SELECT
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB_工作集
FROM sys.dm_os_process_memory;
ReserveMemoryForOtherApp:预留备用内存总内存是8G以上的服务器一般可以预留1600M,这里是为了给服务器的其他应用需要的预留的,如果4G内存可以少留点,800M一般也是足够。
CurrUsedMemory :当前已经使用的内存,这里可以通过任务管理器或者资源监视器可以得到。
关键的是预留内存的把控,根据服务器上运行的应用程序的占用情况决定,理论上,预留够给应用程序的,其他的应该都留给数据库。
其实前面已经说了,理论上不设置服务器最大内存值的话,其实是不会对系统的运行带来影响的,如果在开始的时候设置了合理的服务器最大内存值,那么后面就可以知道服务器其他应用程序占用内存的情况,以及内存消耗增速的情况,作为服务器运维人员了解这些情况就可以确定服务器的定期重启的周期等等。