【www.9778.com】SQL Server内存理解的误区

核心提示:SQL Server数据库与Windows操作系统来自同一个家庭

  为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时,数据先会被读取到这个数据缓存中。当下次用户还需要访问这个数据时,就会从这个数据缓存中读取。因为在数据缓存中读取数据要比在硬盘上读取数据快几百倍。所以扩大数据库服务器内存,可以有效提高数据库性能,特别是操作大型数据库时效果更加明显。

 SQL Server内存理解

警告:注册表编辑器使用不当可造成严重问题,这些问题可能需要重新安装操作系统。Microsoft
不保证能够解决因为注册表编辑器使用不当而产生的问题。使用注册表编辑器需要您自担风险。本文介绍了运行
Exchange Server 2003 的计算机上的内存使用的优化。
如果运行 Exchange Server 2003 服务器上安装了 1 GB
以上的物理内存,则必须确保 Exchange Server 2003 可以有效地使用该内存。
注意:Exchange Server 2003
在存储进程启动时执行最佳内存配置检查。如果内存设置不是最佳的,事件查看器中将会出现事件
9665。如果存在下列任一条件,则会显示此消息:

SQL
Server数据库与Windows操作系统来自同一个家庭,在技术上具有一定的共通性。我们可以调整Windows操作系统的一些参数来提高SQLServer数据库服务器的性能,使之更高效的运行。

  但是,现在企业中普遍采用的数据库服务器都是32位的操作系统。而这个32位的操作系统却有最大内存的使用限制。通常情况下,标准的32位地址最多可以采用4GB的内存。若数据库管理员想让数据库系统采用更多的内存来提高数据库的性能,则就需要进行额外的配置。下面笔者就介绍两种常用的配置方式,让SQLServer数据库服务器支持大内存,让其成为数据库的加速剂。

内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求,提高数据读写的效率。

服务器正在运行 Microsoft Windows 2000 Server,并且注册表中的 SystemPages 值超出了 2400031000 这一范围。
服务器具有 1 GB 或更多内存,并且没有 /3GB 开关。
服务器正在运行 Microsoft Windows Server 2003,具有 1 GB 或更多内存,并且设置了 /3GB 开关,但是不存在 /USERVA 设置或者该设置超出了 30302970 这一范围。

一、 提高虚拟内存来提高数据库服务器性能。

  一、让数据库应用程序支持3GB的内存空间

内存对数据库而言是如此的重要,因此只要在涉及数据库优化的地方,我们都可以看到内存的身影。我们通常会想尽各种办法来优化数据库内存的使用,比如开启AWE、设置最大内存、锁定内存页等,但在很多时候,我们实际上都不知道某个配置是否一定能够解决当前的问题,或者我们误以为会解决当前的问题,出现这种现象的原因是我们对数据库的内存理解还不够透彻或者理解存在误区,本文我希望将结合自己的经验和《SQL
Server 2012实施与管理实战指南》的内容,通过以【介绍SQL
server常见内存误区】的方式跟大家分享下我对SQL server内存的理解。

如果您看到此事件,请检查注册表中的 SystemPages 和
HeapDeCommitFreeBlockThreshold 设置,并检查 Boot.ini 文件中的 /3GB
开关和 USERVA 设置。本文的下列各部分包含对所有这些设置的推荐设置。
如果您要关闭内存配置检查,可以创建以下注册表项:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesMSExchangeISParametersSystem参数:Suppress
Memory Configuration Notification
类型:REG_DWORD
设置:1
运行 Microsoft Small Business Server
的服务器上不会发生内存配置检查。当引发 9665 事件时,DWORD
会作为附加数据写入事件日志中。

虚拟内存简单的来说就是内盘中的一块空间。当物理内存不够时,操作系统会自动把某些驻留在内存中暂时不用的内容移植到这个在硬盘上的虚拟内存中,以释放更多的空间给新的应用程序使用。也就是说,当物理内存使用完时操作系统会拿出一部分硬盘空间来充当内存使用,以缓解内存的压力。为此从某种程度来说,这个虚拟内存的设置也会影响到数据库服务器的性能。那么这个虚拟内存到底该设置多少为好呢?这没有一个固定的标准。这需要数据库管理员根据部署的应用来确定。

  虽然操作系统支持4GB内存。可是,这并不会全部给数据库等应用程序使用。默认情况下,在32位操作系统中,将有2GB的内存空间是为操作系统所保留的。即使没有用完,其他应用程序也是不能够染指的。而包含SQL
Server数据库在内的所有应用程序,只能过采用剩余的2GB内存空间。

 

虚拟地址空间概念

Exchange Server 2003 中的信息存储 (Store.exe)
进程可以处理的内存数量是有限制的,这与硬件配置、服务器上的数据库数量以及用户数量无关。此数量称为虚拟地址空间。大多数情况下,信息存储区使用的此虚拟地址空间决定
Exchange Server 2003
邮箱服务器的总体性能和可伸缩性。对于中小型服务器,Exchange Server 2003
会自动使平衡达到最佳状态。但是,对于大型服务器,您可能需要手动调整一些优化参数。
如果您的 Exchange Server 2003 计算机安装了 1 GB
或更多内存,并且如果计算机是邮箱或公用文件夹的宿主,请确保向服务器上的
Boot.ini 文件添加 /3GB
开关。如果服务器上没有任何邮箱或公用文件夹如邮件网关),请不要使用
/3GB 开关。默认情况下,Microsoft Windows 2000 Advanced Server 和
Windows Server 2003 操作系统保留 2 GB 虚拟地址空间供内核模式使用,保留 2
GB
供用户模式使用。特定进程的虚拟地址空间在启动时分配,并且在操作期间随着内存使用的增加而增加。通常情况下,进程实际使用的内存工作集)大大少于分配给该进程的地址空间。在安装有
1GB 或更多内存的、运行 Exchange Server 2003 的计算机上,必须修改 Windows
2000 Advanced Server 和 Windows Server 2003 操作系统,以便有 3 GB
的用户模式内存空间可用。您可以通过在 Boot.ini 文件中使用 /3GB
开关来完成此操作。
如果您运行的是 Windows 2000 Server Standard Edition,请不要设置 /3GB
开关。Windows 2000 Server Standard Edition
不支持此内存调整开关。如果您这样做,服务器不会生成错误信息,但是设置此开关会导致存在假内存地址空间。如果某个进程试图访问这个较大的地址空间,蓝屏上则会出现一条“Stop”停止)错误信息,服务器将停止响应。
注意:Windows Server 2003 的所有版本包括 Windows Server 2003
Standard Edition)都支持 /3GB 调整开关。 有关如何设置 /3GB
开关的其他信息,请单击下面的文章编号,以查看 Microsoft
知识库中相应的文章: 266096XGEN:Exchange 2000 Requires /3GB Switch with
More Than 1 Gigabyte of Physical RAM 如果您在基于 Windows Server 2003
的计算机上运行 Exchange Server 2003,并且设置 /3GB 开关,则
Microsoft 建议您在 Boot.ini 文件中设置 /USERVA=3030
参数。这样,服务器上就可以有更多的系统页目录项 (PTE)。 有关 /USERVA
开关的其他信息,请单击下面的文章编号,以查看 Microsoft
知识库中相应的文章: 810371XADM:Using the /Userva Switch on Windows 2003
Server-Based Exchange Servers确保 Store.exe
进程不会将虚拟地址空间用尽。当虚拟地址空间耗尽时,即使有大量物理 RAM
可用,内存分配也将失败。要解决此问题,您必须重新启动信息存储服务。例如,具有
2 GB 物理 RAM、但没有在 Boot.ini 文件中设置 /3GB 开关的服务器在
Store.exe 进程所使用虚拟地址空间达到 2 GB
时将会出现内存不足的情况。在这种情况下,Windows
任务管理器可能会显示实际只使用了大约 1.5 GB
的内存。但是,服务器确实内存不足,并且必须重新启动信息存储服务。
当 Store.exe 进程的虚拟内存不足时,Exchange Server 2003
服务器的性能可能会大大降低。当最大的可用虚拟内存块减至 32 MB
时,事件查看器的应用程序日志中会生成事件 ID 9582
警告事件。如果您看到此事件,下次有机会时最好重新启动 Store.exe
进程。如果最大内存块减少的更多,只有 16
MB,则事件查看器的应用程序日志中会生成事件 ID 9582
错误事件。如果发生此事件,则服务器已接近临界操作条件,下次有机会时必须重新启动服务器。发生此错误后,内存可能会在几个小时内耗尽。如果您没有响应这些事件,可能会遇到下列症状中的一个或多个:

间歇性消息传递故障。
由事件 ID 12800 指示的间歇性 Internet 邮件 (IMAIL) 转换过程故障。
某些支持 Exchange 的防病毒程序可能会生成错误信息或事件。

如数据库没有一些高级的应用,如数据仓库、全文索引或者不适多个应用服务一身的话,笔者认为只要把虚拟内存设置为物理内存的1.5倍即可。但是,如果在数据库服务器上配置了数据仓库或者全文索引的话,则这个1.5倍的虚拟内存往往是不够的。此时笔者建议需要把虚拟内存配置为物理内存的3倍到四倍。同时,需要调整数据库中的最大服务器内存选项,将其设置为物理内存的1.5倍。也就是说,其在使用内存的时候,可以使用虚拟内存大小的一半。注意这个设置时必须的,否则的话,调整数据库虚拟内存很难起到应有的效果。而且当以后内存升级了,则也需要同时更改这个两个参数。

  但是,在实际应用中,操作系统往往用不着多大2G的内存。根据笔者的经验,一般只要为操作系统保留1G的内存已经足够其使用。只要没有病毒等不良因素作怪,这个内存不会被完全适用。如此的话,应用程序可以采用的内存空间就会多达3G,比原先整整多出一个G来。

误区一: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位,这种问题以后几乎都碰不到了。)

  1. 从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(标准版、企业版)

这个是参考资料的,实际场景下我没有用过。

 

最大化虚拟地址空间

要确保性能和稳定性不会降低,最好监视大型邮箱服务器上信息存储的虚拟地址空间。完成此操作的最简单方法是,在“性能”实用工具中监视
MSExchangeIS
性能对象的虚拟内存最大块大小计数器。该值以字节为单位进行显示。启动计算机后,通常应查看最大虚拟内存块大小是否明显减少。但是,经过一两天的运作后,该值会接近通常的操作级别。如果最大可用虚拟内存块的值大于
200,000,000 字节大约 200
MB),则表示服务器运行正常。如果您发现值小于该数值,请更加亲切地监视服务器。如果您遇到虚拟地址空间不足的情况:

1. 如果您安装了 1 GB 或更多物理内存,当服务器满足下列条件时,请确保在 Boot.ini 文件中设置 /3GB 开关:

服务器是邮箱或公用文件夹的宿主。
操作系统是 Windows 2000 Advanced Server 或 Windows Server 2003。

如果服务器上没有任何邮箱或公用文件夹如邮件网关),请不要使用 /3GB 开关。

2. 如果 Exchange Server 2003 安装在基于 Windows Server 2003 的服务器上,并且它设置了 /3GB 开关,请确保在 Boot.ini 文件中设置 /USERVA=3030 开关。如果 Exchange Server 2003 安装在基于 Windows 2000 的服务器上,请确保该服务器运行的是 Windows 2000 Service Pack 3 (SP3) 或更高版本。
3. 如果您安装了 1 GB 或更多物理内存,请在以下注册表项中配置 HeapDeCommitFreeBlockThreshold 注册表值,然后重新启动服务器: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager值名称:HeapDeCommitFreeBlockThreshold
数值类型:REG_DWORD
值数据:0x00040000推荐)
默认值:不存在有关如何使用和配置此注册表值的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 315407XADM:The "HeapDecommitFreeBlockThreshold" Registry Key

通常情况下,前面的步骤可以解决虚拟地址空间使用问题。不过,在一些较大的服务器上,您可能必须对“存储数据库缓存大小”进行其他调整,才可重新平衡性能与可伸缩性之间的差距。

最后需要说明的一点就是,虚拟内存并不是越大越好。如果设置为10倍、20倍,那么这是浪费。以往内存中没有这么多的内容可以往虚拟内存中存放。所以,针对SQL
Server数据库与Windows服务器来说,4倍于物理内存的虚拟内存已经足够了。设置的再大的话,就没有多少的实际意义了。

  要实现这个转变,其实很简单。在Windows操作系统中,有一个BOOT启动配置文件。为了让数据库服务器支持3GB的用户模式进程空间,必须在这个配置文件中,加入一个/3gb的参数,然后重新启动操作系统即可。这么设置之后,应用程序就可以寻址3GB的进程地址空间
,而为操作系统保留1GB的内存空间。

误区二:在开启了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的大小没有限制。

 

存储数据库缓存大小

存储数据库缓存也称为 ESE
缓冲区,在数据库事务被提交到存储区之前,该缓冲区为这些事务提供较大的缓存区域。默认情况下,Exchange
Server 2003 会查询本地计算机的内存配置,然后分配 896 MB 的 RAM如果
Boot.ini 文件中设置了 /3GB 开关),或者分配 576 MB 的
RAM如果没有设置 /3GB
开关)。如果服务器负载过重,或者如果磁盘性能不是最佳,则使用较大的 ESE
缓冲区会提高系统的总体性能。根据您的配置,您可能必须增加或减小此缓冲区的大小,以便获得最佳的总体性能。
如果 Exchange Server 2003
所在的环境中存在其他服务器端程序,则它可能会独占可用的内存资源。“动态缓冲区分配”(DBA)
算法负责在其他程序需要内存时将内存归还给操作系统。不过,您可以通过减小
ESE 缓冲区手动限制 Exchange Server 2003 使用的内存。
在具有 2 GB 以上内存的服务器上,增加 ESE
缓冲区大小可能会有所帮助。由于虚拟地址空间限制,该值不能大于 1,200
MB。
增加最大缓冲区大小之前,最好使用
Windows“性能”实用工具监视具有典型负载的服务器上的内存。为此,请监视以下性能对象和值:
性能对象:进程
性能计数器:虚拟字节
实例:STORE在性能监视期间收集的信息可为您提供 Store.exe
进程已分配的虚拟地址空间的准确值。在 Boot.ini 文件中设置了 /3GB
开关的服务器上,“性能”实用工具中显示的值通常小于 2.8 GB。在 Boot.ini
文件中设置 /3GB 开关的服务器上,显示的值通常小于 1.8 GB。在安装了 1
GB 或更多内存的服务器上,最好向 Boot.ini 文件中添加 /3GB
开关。如果您看到的任一配置的值大于以前注意到的那些值,则不要增加最大缓冲区大小。如果您看到的任一配置的值小于以前注意到的那些值,可能需要增加数据库最大缓冲区大小。
例如,如果您的服务器在 Boot.ini 文件中配置了 /3GB
开关,而且性能监视在服务器负载过重时显示 2.5 GB
的虚拟字节计数,则您或许可以将最大缓冲区大小增加 300 MB 左右,使总大小为
1,200 MB。
增加缓冲区大小可能会对服务器性能产生不利影响。缓冲区越大,意味着使用的虚拟地址空间越多。因此,如果您的服务器遇到虚拟内存地址空间限制,增加缓冲区大小可能会导致操作系统不稳定。在非常大的邮箱服务器上,可能必须减小默认的缓冲区大小才可防止系统不稳定。

二、 调整本地客户端的任务优先级。

  有时候,这个小小的配置可以在很大程度上提高数据库的性能。记得有一次,笔者为一家企业优化数据库性能。笔者查看了用户的数据库环境之后,就建议用户增大数据库服务器的内存,从2G增加到4G.可是,效果并没有很大的改善。正当笔者束手无措的时候,就想到了改变操作系统与应用程序的内存分配方式。为此,笔者就更改了BOOT启动配置文件,只给操作系统保留1G的内存空间。重新启动后,数据库性能得到了很大的改善。

误区三:SQL Server进程不会使用超过最大内存设置的内存大小。

在SQL server的sp_configure中有一个max server memory
(MB)的配置项(SSMS中右击实例,在属性中选择内存也可以看到),我们很多人以为设置了这个值以后SQL
server的进程不会使用超过这个大小的内存。

其实不然,max server memory (MB)只是buffer pool的上限。但是在SQL
server的内存中,不仅仅包括buffer
pool,还有multi-page的内存,对于这部分内存,是无法通过max server memory
(MB)来限制的,所以,在实际环境中,我们可能会看到sqlservr.exe这个进程会占用的内存会超过max
server memory (MB)设定的值。

备注:一般情况下,multi-page占用的空间不会很大,因此,通常我们将max
server memory (MB)约等于SQL server进程占用的内存大小。

 

如何修改 ESE 缓冲区大小

msExchESEParamCacheSizeMax 参数控制 ESE
缓冲区大小。它的值以页计数的形式表示,并且必须设置为 8192
的精确倍数才可实现最大效率:

设置了 /3GB 开关的服务器上的默认大小:229376 (896 MB)
没有设置 /3GB 开关的服务器上的默认大小:147456 (576 MB)
推荐使用的最大值:307200 (1.2 GB)
具有地址空间限制的大型服务器上的推荐值:196608 (768 MB)

注意:如果 ESE
缓冲区大小设置的较大,事务日志的重放速度会大大加快。如果需要进行灾难恢复,可能需要将
ESE 缓冲区大小暂时增大为 307200
如果已经将 Exchange 5.5 Server 计算机就地升级到了 Exchange 2000
Server,您可能会注意到为 msExchESEParamCacheSizeMax
参数分配了一个异常高的值。在有些服务器上,该值等于 2,048
MB。在这种情况下,请删除该参数或将其重置为更适当的值。要修改存储数据库缓存大小,请执行下列操作:

1. 启动“ADSI 编辑”实用工具。“ADSI 编辑”包含在 Windows 支持工具中,它位于 Windows 2000 或 Windows Server 2003 CD-ROM 的 SupportTools 文件夹中。
2. 在“配置容器 [servername.example.com]”其中 servername.example.com 是服务器的完全限定域名 FQDN)下,展开“CN=Configuration, DC=example, DC=com”。
3. 依次展开 “CN=Services”、“CN=Microsoft Exchange”、“CN=组织名称”其中,组织名称是您组织的名称)、“CN=Administrative Groups”、“CN=第一个管理组”其中,第一个管理组是您管理组的名称)、“CN=Servers”和“CN=服务器名称”。
4. 在“CN=服务器名称”下,右键单击“CN=InformationStore”,然后单击“属性”。
5. 在“请选择要查看的属性”列表中,单击“两者”。
6. 在“请选择要查看的属性”列表中,单击“msExchESEParamCacheSizeMax”。
注意:msExchESEParamCacheSizeMax 属性超出了“请选择要查看的属性”列表的宽度。确保不要无意中单击“msExchESEParamCacheSizeMin”属性。
7. 在“编辑属性”框中,键入要分配给此属性的值。
注意:确保您输入的值是 8,192 的倍数。
8. 单击“设置”,然后单击“确定”。
9. 退出“ADSI 编辑”实用工具,然后留有足够的时间以便将该值复制到整个 Active Directory 林中。
10. 在 Exchange 服务器上重新启动 Microsoft Exchange 信息存储服务.

:注册表编辑器使用不当可造成严重问题,这些问题可能需要重新安装操作系统。Microsoft
不保证能够解决因为注册表编辑器使用不当…

在数据库初始化的过程中,有大部分的任务需要在本地客户端上完成。即时在后续维护中,出于某种原因仍然要在本地客户端上操作。那么什么是本地客户端呢?其实本地客户端就是跟数据库服务器部署在同一台计算机上的客户端。如我们在导入期初数据的时候,为了方便会在本地客户端上直接进行操作。因为这可以节省数据在网络上传输的时间。

  二、为SQLServer启用更高的内存支持

误区四:设置了SQL Server的最小内存,表示SQL server启动时就会使用到这个大小的内存。

在SQL server的最小内存也是通过sp_configure配置,配置项为min server
memory
(MB)。该配置项默认为0,表示不限定最小内存,如果设置成某个具体值时,比如2G,表示当SQL
server占用的内存超过这个大小后,就不会再低于这个值。而不是说SQL
server启动时就马上达到这个值。

这种机制的好处就是避免SQL
server的内存被操作系统不断挤占,这样当负载一旦起来,数据库可以立即使用内存而不需要向操作系统申请内存。(当数据库申请时不见得操作系统有多余的内存分配给数据库,这时数据库就只能歇菜了)。

因此合理设置数据库的最低内存也是十分重要的。微软建议的最小内存值为服务器总内存减去1-2G,跟最大内存的值差不多。(前提是这个服务器制作数据库服务器)

参考资料:

 

不过在本地客户端上进行操作的时候,往往分为前台运行与后台运行。操作系统这么设计的本意是为了提高远程客户端的执行效率。如在远程客户端生成物料需求计划的时候,由于运算量比较大,其花费的时间可能比较久,如可能需要20分钟。为了提高工作效率,对于类似的作业,应用程序可以把这个运算放置在后台运行。不过需要注意的是,把某个作业放置在后台运行,并不能够节省其运行的时间,而往往由于放置在后台的作业其优先级比较低,往往实际花费的时间还会延长,如会延长到23分钟等等。之所以要把这个长时间运行的作业放置在后台,主要是为了让用户不用干等,可以先作其他事情。等到运行完成后,系统会自动把相关的结果返回给用户。这在感觉上是缩短了运行的时间(往往在等待的过程中时间过得特别慢),而实际上其运行的时间根本没有缩短,甚至会更长。

  如果数据库应用程序内存寻址空间达到3GB后,数据库管理员还不满足的话,则就需要通过增加物理内存的方式,来提高应用程序的性能。若需要服务器操作系统突破其默认4GB内存空间的限制,支持4GB以上的内存空间,也不是不可能的。只是需要进行额外的配置,并且,其维护的工作量也比较大。

误区五:SQL server占用内存特别大,说明SQL server有问题。

常见的关系型数据库都有这个特点:数据库就会尽可能的占用服务器的内存,而且这些占用的内存中即使很大部分空闲也不会释放,除非操作系统遇到内存压力,才会被操作系统重新分配。因此我们可以看到数据库服务器的内存使用率一般都会很高。

这其实并不是一个问题,反而是数据库的一个特性,就如文中首段说的,只有越多的数据缓存在内存中,数据库的读写效率才会越高,响应速度才会越快。这才是使用数据库的最佳方法。

不过,在很多场景下,服务器并非专用于数据库,为确保服务器上其他应用程序也能正常运行,我们必须为数据库设置最大内存,否则其他应用程序就会因为内存不足出现访问不流畅的问题。笔者曾碰到一个案例,某医院的HIS服务器必须每隔几天重启一次才能保证HIS业务能够被正常访问。原因就是因为数据库内存没有设置最大值,导致应用程序的内存被数据库挤占。

 

这个处理策略对于远程客户端来说确实有用,至少可以在感觉上缩短用户的等待时间。而且可以让用户先进行其他的操作。但是如果在本地客户端上,处理某些作业的时候,可能并不希望如此。如在本地客户度进行物料需求计划测试,数据库管理员希望即时把这个计划放置在后台运行,其也能够与前台应用程序具有相同的优先级,以减少这个处理时间。所以,当数据库管理员遇到类似情况时,就需要调整操作系统的相关设置,让作为在后台运行的应用程序,也能够与前台运行的其他应用程序具有相同的优先级。

  若想要SQLServer数据库支持4GB以上的内存寻址空间,则往往需要进行如下配置。

误区六:内存使用率高说明数据库服务器的遇到了内存压力。

(影响SQL Server性能的因素很多,不过因为本文的中心是谈谈内存因素与SQL
server的关系,所以其他因素不在本文考虑范围内。)

如果一个DBA因为数据库服务器的内存使用率很高而做出内存存在压力的判断,说明这个人还不够全面。前文已经说过,数据库“喜欢”内存是天性,几乎所有DB服务器都会出现内存使用率很高的问题(除非设置最大内存,且最大内存远低于服务器内存),因此我们不能据此来判断数据库的内存压力。

我们通常会通过一些性能计数器来监控数据库的内存使用情况,据此作出压力的判断:

SQLServer:Buffer ManagerBuffer cache hit ratio

(一般要求OLTP的cache hit ratio在95%以上,OLAP则需要在90%以上才能称之

为性能良好)

SQLServer:Buffer ManagerPage life expectancy

SQLServer:Buffer Managerfree pages

SQLServer:Memory ManagerTarget Server Memory

SQLServer:Memory ManagerTotal Server Memory

上述后三个指标最能直观反映SQL server是否存在内存压力,free pages表示SQL
server占用的内存中,有多少页面是free状态,将这个数值乘以8KB就得到了可用缓存的大小,这个值越大,说明SQL
server占用的内存有很多还未被使用,因此说明了内存没有压力问题。

Total Server Memory表示SQL server为自己分配的buffer
pool的总大小(已使用和未使用)。Target Server
Memory表示操作系统能够分配给SQL
server的目标内存大小,其最大值约等于【误区一】中描述的SQL
server可用地址空间的大小,但会随着操作系统的压力增加而减少。正常情况下,Target
server memory会大于total server memory,说明SQL server为自己分配的buffer
pool还比较少,小于操作系统为SQL
server设定的目标内存大小,数据库此时不会有内存压力。不过,随着操作系统的压力增加,它会调小Target
Server memory的值,使其小于SQL Server的Total Server
Memory,这样一来,SQL Server不得不释放已占用的缓存,减小total server
memory,这种情况,说明数据库服务器存在内存压力。

 

通常情况下,安装完干净的SQL
Server数据库时,服务器任务调度设置为“务”,即前后台应用程序没有优先级的分别。也就是说,此时将为前台应用程序与后台应用程序提供相等的处理时间。但是有时候为了兼顾远程客户端,在部署实例的时候,会改变这设置。如把降低后台应用程序的优先级,让更多的资源能够服务于前台应用程序。在大部分情况下,这个设置是必要的。不过如果出于某些原因需要在本地客户端执行某些操作的话,则数据库管理员需要暂时调整这个配置,以节省某些作业的运行时间。有时候甚至可以将服务器任务调度设置为最大或者应用程序,这就可以为前台应用程序提高最大的处理器时间。

  第一步:锁定内存页。

www.9778.com ,误区七:增加内存一定能够提升SQL server的性能。

数据库虽然会尽可能多的占用内存,但并不意味增加内存就一定是越多越好,就如同上文说的,如果数据库的内存长期没有什么压力,增加内存也不会带来性能的提升。

另外,在32位 的SQL
server中,在数据库启动时就为连接、查询计划、第三方dll、链接服务器等分配了固定大小的multi-page(上文在介绍AWE时已有介绍),因为multi-page的大小不会随着内存的增加而改变,所以即使增加内存,也无益于这些功能、组件,而只是为增大了数据缓存。

备注:在64位的SQL server中,multi-page的大小没有限制。

 

可见,任务调度计划设置也没有一个统一的优劣标准。主要还是需要看数据库服务器到底用来做什么?为此这也对数据库管理员提出了比较高的要求。此时数据库管理员必须要理解各种优先级设置对于数据库服务器性能的影响。然后再根据当时的实际应用来合理的调整任务级别的优先级,以取得本地客户端操作的最大性能。

  默认情况下,内存大小与操作系统的虚拟内存之间有一个正比例关系。在这里,数据库管理员只想增大服务器的物理内存,而不想对虚拟内存有什么影响。故需要锁定内存页。锁定内存页的主要作用就是确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。默认情况下,这个选项的只为OFF.也就是说,在必要的时候,系统会将数据分页到硬盘的虚拟空间中。为了最大程度发挥内存的效用,就需要把这个选项开启。不过这数据库管理员往往需要寻求系统管理员的帮助,因为只有具有系统管理员权限的用户,才能够给更改这个选项。

误区八:如果其他应用程序也需要内存,SQL server会释放一部分自己的内存,以保证其他应用程序能够正常运行。

SQL
Server不会为其他程序释放自己以占用的内存,只有在操作系统遇到内存压力时,才会根据操作系统的要求减少自己的内存占用量。

但如果SQL
server启用了锁定内存页的,那即使是操作系统有要求,其内存也不会释放。因为锁定内存页会使SQL
server占用的内存长久保留在物理内存中,避免被分页到虚拟内存中去,这是提升SQL
server性能的常见做法。在SQL
Server的推荐配置中,我们经常建议客户这样做。不够为了避免内存占用太大,可以通过设置最大内存来限定内存的使用上限。

三、 限制系统内存用户文件缓存的大小。

  第二步:启用Awe Enable选项。

毋庸置疑,数据库服务器的物理内存对于数据库的性能具有至关重要的影响。但是有时候我们会发现一个奇怪的现象,即即时增加了数据库服务器的物理内存,但是仍然没有发现数据库的性能有很大的改善,或则说比原先的还要差一点。这是什么原因呢?如结合SQLServer数据库来说,这主要是内存的分配不是很合理。如大部分的内存被用来存放文件缓存。此时如果增加的内存都被用来存放文件缓存了,那么光靠简单的增加内存并不能够提高数据库的性能。所以,有时候我们数据库管理员需要优化SQL
Server服务器的内存使用情况,如需要限制用户文件缓存的内存量。

  默认情况下,即使服务器操作系统支持4GB以上的内存空间,可是数据库应用程序并不一定支持。为了让SQLServer应用程序也支持这个,就必须更改数据库的配置参数。也就是说,需要将这个选项的值设置为1,然后重新启动数据库系统。这个配置比较简单,只需要利用命令sp_configure
‘awe enabled’,
1即可。不过在进行这个配置之前,需要注意两个细节方面的内容。一是数据库用户需要这个操作的权限。二是这里有一个BUG,即在SQL
Server数据库中会有一个错误信息。数据库管理员可以忽略这个信息。

那么该如何限制呢?这不是SQLServer数据库服务器来完成的,而是需要通过Windows操作下系统的配置来实现。如要限制文件系统缓存,需要确保没有选择“最大化文件共享数据吞吐量”这个选项(其原来是为文件共享所准备的),然后选择“最小化使用对内存”或者“平衡”选项,来制定最小文件系统缓存。

  第三步:限制文件系统缓存。

具体来说,可以按如下步骤来调整这个选项,以提高服务器的性能。首先,依次打开控制面板、选择网络连接、单击本地连接。然后打开常规选项卡,选择属性。在本地连接属性对话框中选择常规选项卡,选择微软网络的文件和打印机共享,并单击属性。在弹出来的对话框中,去掉“最大化文件共享数据吞吐量”选择,可以选择“最大化网络应用程序的数据吞吐量”。然后按确定即可。如此操作系统就会自动调整内存的分配,不会给文件缓存保留很大的空间,从而可以提高数据库内部处理的性能。往往这对于事务性的应用系统很有作用,能够在很大程度上提高数据库的性能。

  若增加的内存给操作系统或者其他应用程序用了,那么数据库管理员不是白忙一场吗?为此,数据库管理员还需要优化数据库系统内存的使用情况。如需要限制系统用于文件缓存的内存量。如要这么处理的话,只需要简单的三个步骤即可。

不过在调整这个配置后,如果在站台服务器上还部署有文件服务器的话,那么这个文件服务器的性能就会受到比较大的影响。因为对于文件服务器应用来说,需要比较大的文件缓存量。为此在某种程度上来说,数据库服务器与文件服务器在这方面是相互冲突的。数据库管理员就需要相互权衡,然后确定一个最佳的处理方案。不过一般情况下,不建议将数据库服务器与文件服务器、打印服务器等等部署在同一个服务器上。因为这三种不同的应用,彼此之间的资源争用还是很厉害的。为此会给数据库的性能带来比较大的负面影响。

  首先,数据库管理员在操作系统中,找到控制面板,并双击网络连接,然后选中本地连接。其次,双击本地连接,在弹出的对话框中,找到常规选项卡,单击属性。选中网络文件与打印机共享,并单击属性。最后,在弹出的对话框中,去掉”最大化网络应用程序数据吞吐量”复选框。一路按确认即可。这个简单的步骤,就可以优化数据库内存的使用率。

如果光从数据库服务器来说,限制文件缓存的内存使用量,确实可以提高数据库服务器的性能。特别是对于某些特别的应用与计算,由于需要用到比较大的内存,故可以大幅度提高这些作业的运算量。

  三、大内存维护管理几个关键点

可见我们在优化数据库性能的时候,有时还不能够光从数据库服务器着手。必要的时候,我们需要换一个角度,从操作系统出发,调整操作系统的相关配置,也能够明显的提高数据库的性能。

  在通常情况下,往往不需要启用4GB以上的内存。但是,若在服务器上,同时启用了其他的应用程序服务。如在一台服务器上同时有数据库应用程序、邮件应用程序、文件服务器等多个应用服务的话,则可能原有的4GB内存无法满足。系统管理员不得不对内存进行升级。但是,对内存升级之后,数据库管理员需要手工对内存的分配进行干预,以免SQLServer应用程序占用比较多的内存空间,而影响其他应用程序的性能。

  1、配置max server
memory选项。虽然说这个选项并不是必须要修改的,但是笔者仍强烈建议数据库管理员要修改这个选项。特别是数据库应用程序与其他应用程序共享同一台服务器时。因为启动SQLServer对大内存的支持后(将Awe
Enabled设置为1),而且可用物理内存大于用户模式进程空间。则当启动数据库服务器时,运行的SQLServer实例将会占用几乎所有的可用内存
(不管需不需要使用,数据库服务器程序会先锁定这些内存。这就叫占着茅坑不拉屎)。而这个max
server
memory选项就是用来配置其最大可以占用的内存数量。数据库管理员需要预先估算出一个合理的数值,然后进行配置。让数据库应用程序与其他应用服务能够共同改善,至少不能够对其他应用程序的性呢产生不良影响。在比较极端的情况下,可以在升级内存之前,先关闭数据库应用程序;然后启用其他应用程序服务。观测一段时间,看看他们所需要用到多少的内存。然后升级内存,并为其他应用程序至少保留以前所需要的内存空间。否则的话,就会对其他应用程序产生不良影响。牺牲其他应用程序的性能来提高数据库的性能,这是拆西墙补东墙的做法,不值得取。

  2、多个SQLServer实例内存如何分配。往往在一个SQLServer数据库中,会配置多个数据库实例。一个数据库实例用来负责ERP系统的运行,另外一个则是给CRM系统使用。在同一个数据库系统中,有多个数据库实例,此时该如何在各个实例之间分配可用的内存呢?这基于操作系统的不同,又有所不同。如果数据库操作系统采用的是2000系列的,则需要为每个数据库实例配置max
server
memory选项。否则的话,其中某一个数据库实例就有可能锁定全部的可用内存。这主要是因为2000系列的服务器系统并不支持动态分配大内存。所以需要为每个数据库实例配置这个选项。但是,若数据库服务器采用的是2003系列的服务器操作系统,则不需要进行手工的配置这些参数。因为操作系统会动态地分配内存。也就是说,操作系统会按照总体系统要求平衡SQLServer各个实例之间内存的使用。不过为了提高数据库整体性能,最好还是为各个实例配置max
server memory;而不让操作系统来搞平衡。