SQL Server内存理解
内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求,提高数据读写的效率。
内存对数据库而言是如此的重要,因此只要在涉及数据库优化的地方,我们都可以看到内存的身影。我们通常会想尽各种办法来优化数据库内存的使用,比如开启AWE、设置最大内存、锁定内存页等,但在很多时候,我们实际上都不知道某个配置是否一定能够解决当前的问题,或者我们误以为会解决当前的问题,出现这种现象的原因是我们对数据库的内存理解还不够透彻或者理解存在误区,本文我希望将结合自己的经验和《SQL Server 2012实施与管理实战指南》的内容,通过以【介绍SQL server常见内存误区】的方式跟大家分享下我对SQL server内存的理解。
SQL Server 2012实施与管理实战指南 (俞榕刚,朱桦) PDF高清扫描版[250M] 下载地址:
误区一:SQL Server在32位操作系统只能使用4G内存对于这个问题,我们从两个方面来看:
1. 在32位操作系统中,应用进程可以使用的虚拟地址空间大小为4G,其中2G是给核心态(操作系统),另外2G留给用户态(应用程序)。因此,SQL server其实能最大利用的内存只有2G。
不过,这种核心态和用户态的分配方式是可以改变的,当在操作系统的启动文件(windows server 2003的boot.ini)中开启3G开关后,便可以使得用户态的内存增加到3G,而只留1G给核心态,这样做的好处是可以使得SQL server使用到3G的内存,不过坏处也很明显,因为减少了核心态的地址空间,在操作系统系统负载比较大时,可能会出现不稳定的风险。
(目前使用使用32位操作系统的客户越cong来越少,而且微软新推出的操作系统也都是64位,这种问题以后几乎都碰不到了。)
2. 从windows server 2003到windows server 2008,只要是标准版或者WEB版,且为32位架构时,操作系统最大也只能支持4G内存,即使按照上文1介绍的方法开启了3G开关,SQL server也只能使用最大3G的内存。
但如果是企业版或者数据中心版的操作系统时,同样是32位的架构,操作系统却最大可以支持到64G的内存(开启PAE的前提下)。但默认情况下SQL server依然只能使用最大2G的内存。
因此,相比64G的操作系统内存来说,2G对数据库而言简直就是杯水车薪,资源浪费。为解决这个问题,微软为企业版和标准版的SQL server(2005、2008)引入了AWE(地址窗口扩展)功能,你可以通过开启AWE来扩展SQL server的可用内存,使之最大可以达到64G内存(实际上会小一点,因为操作系统本身需要占用部分内存)。
总结起来,可以用一个表格来描述上面两个场景:
操作系统类别
SQL Server可用地址空间
备注
32位
2G
32位+/3G开关
3G
32位(标准版、企业版)+SQL Server AWE
64G(标准版、企业版)
32位(标准版、企业版)+/3G开关+SQL Server AWE
16G(标准版、企业版)
这个是参考资料的,实际场景下我没有用过。
误区二:在开启了AWE后,SQL Server的所有功能一定能使用超过2G的内存。
在SQL server进程中,内存并非全部由SQL server的数据缓存所使用,部分通过SQL server调用的第三方代码、加载在SQL server内部的其他dll、SQL server连接、链接服务器、编译缓存、查询计划缓存等也会使用SQL server进程中的内存。
这部分组件或者功能在申请内存时与传统的数据缓存申请的方式不同,因为他们通常会申请大于8KB的内存页,这种内存区域为multi-page(以前叫memtoleave)。对于multi-page占用的内存,是没法使用SQL Server的AWE特性的,也就是说,在32位的SQL Server中,数据库即使开启了AWE,也只能使用到2G的内存(用户态)。由此可见,AWE更多的是提升了data page buffer pool的内存空间。
备注:在32位的SQL Server中,multi-page的默认大小为256MB+sp_configure配置的最大线程数X512KB,它是SQL server启动时就已经设定好的。
备注:在64位的SQL server中,multi-page的大小没有限制。
误区三:SQL Server进程不会使用超过最大内存设置的内存大小。