SQL Server是计算机中的内存消耗大户,而且只吃进,不主动释放,直到把计算机的内存耗尽,在执行某个大操作时,突然警示内存不足。尽管从SQL Server2019版本开始,安装程序会根据系统可用内存的百分比,为独立 SQL Server 实例提供“最大服务器内存(MB)”的建议,微软仍然建议在所有版本的 SQL Server 中配置最大服务器内存 (MB)来限止 SQL Server 内存利用率的上限。
本文就某些情况下配置SQL Server内存的坑点,做些提示。正常情况下,微软的“下一步”就够用了。
SQL Server2000版的坑点:
- SQL Server2000有64位版本,但它仅限于IA64架构,X86的计算机上用不了。
- SQL Server2000在64位的windows2008系统上能正常运行,不需要配置PAE就可以突破4G内存的限止。但需要打SP4补丁包,以及未正式发布的KB899761补丁。分辨方法:打上补丁的SQL的版本号是8.00.2040
- SQL需要启用AWE,并指定最小内存和最大内存,微软建议最小值不要等于最大值,实测也没啥问题。
- 启用AWE后,在Windows任务管理器和资源监视器里,看到的使用内存最多不超过500M,那是不准确的,但总体使用内存是准确的。用性能监视器(perfmon.exe)添加相关计数器,才能看出SQL Server使用了多少内存。
- 启用AWE,Windows要配置锁定内存分页(鎖定記憶體中的分頁):组策略(gpedit.msc):计算机配置 — Windows设置 — 安全设置 — 本地策略 — 用户权限分配 — 锁定内存页:填写SQL Server的登入身份(用户组)。
- 如果在安装SQL Server的计算机上能连通SQL,但客户端连不上,很有可能是没有打SP4补丁包。
- 上述配置做完后,要重启一次SQL Server服务。
如果每个数据库不超过20G,建议用多个SQL Server2000实例的方案来取代AWE方案,每个实例可以用到3.8G的内存,安全方面可以做到更精细。缺点是,每个实例都要重新安装一次SQL Server,而且每次都要打补丁。
如果服务器的防火墙已打开,客户端用【IP,Port】连接SQL Server,性能会好过用【计算机名\实例名】,而且服务器上也不需要启动【SQL Server Browser】 服务。
64位SQL Server2008R2的坑点:
- 64位的SQL配64位的操作系统,使用大内存,不需要PAE,但AWE难说。
- 微软官方说法,64位的SQL Server不需要开启AWE。实际情况是,如果不开启AWE,设置的最大内存无效,有可能耗尽计算机的全部内存而挂机。
- 开启AWE后,SQL Server的使用内存不会突破设置的最大内存,但在Windows任务管理器和资源监视器里,看不出真实的内存使用情况。
限止SQL Server2008R2最大内存的有效方法,就两个:
- 定期重新启动SQL服务,缺点是有些数据库要求24小时在线,重启可能会影响使用。
- 启用AWE,设置最小内存和最大内存,缺点是64位的SQL微软是不建议用AWE的,隐患尚未知。
关于使用内存的几个单词的析义:
- 提交内存:SQL向计算机申请的内存,可理解为预订内存。因SQL是不会主动释放内存的,它的提交内存就会越来越大,直致耗尽计算机的全部内存。
- 工作集内存:程式用到的内存,包含专用内存和共享内存。
- 专用内存:程式本身用到的内存,关闭后释放。
- 共享内存:程式相关联的 dll 等文件使用的内存,dll 往往是多个程序共用的,所以共享内存一般也不会主动释放。
- SQL的内存虽不能释放,但可以用命令释放缓存,减少内存的申请。释放缓存的命令:
//删除计划缓存中的所有元素
DBCC FREEPROCCACHE;
/刷新分布式查询缓存
DBCC FREESESSIONCACHE;
//从所有缓存中释放所有未使用的缓存条目
DBCC FREESYSTEMCACHE('All');
//从缓冲池中删除所有清除缓冲区
DBCC DROPCLEANBUFFERS ;