服务器内存选项

使用 min server memorymax server memory 这两个服务器内存选项可以重新配置 Microsoft SQL Server 实例所使用的缓冲池的内存量 (MB)。

默认情况下,SQL Server 的内存要求会根据可用系统资源的情况动态地变化。min server memory 的默认设置是 0,max server memory 的默认设置是 2147483647。可为 max server memory 指定的最小内存量为 16 兆字节 (MB)。

注意注意

如果将 max server memory 设置为最小值,则可能会严重降低 SQL Server 的性能,甚至使其无法启动。如果在更改此选项之后无法启动 SQL Server,则请使用 –f 启动选项进行启动,并将 max server memory 重置为以前的值。有关详细信息,请参阅使用 SQL Server 服务启动选项

当 SQL Server 动态使用内存时,它会定期查询系统以确定可用物理内存量。SQL Server 使用内存通知 API QueryMemoryResourceNotification 确定缓冲池何时可以分配内存及释放内存。

建议允许 SQL Server 动态使用内存;但可以手动设置内存选项并限制 SQL Server 可以访问的内存量。在设置 SQL Server 的内存量之前,请通过从总物理内存中减去操作系统和任何其他 SQL Server 实例所需的内存(如果计算机并非完全由 SQL Server 专用,则还要减去其他系统使用的内存量)来确定适当的内存设置。这个差值就是可以分配给 SQL Server 使用的最大内存量。

手动设置内存选项

设置 min server memorymax server memory 以建立一个内存值范围。这种方法在系统或数据库管理员希望配置 SQL Server 实例,同时又要考虑在同一台计算机上运行的其他应用程序的内存需求时很有用。

使用 min server memory 确保 SQL Server 实例的缓冲池可用的最小内存量。SQL Server 在启动时将不立即分配在 min server memory 中指定的内存量。不过,除非降低 min server memory 的值,否则当内存使用量由于客户端负荷而达到该值后,SQL Server 不能从已分配的缓冲池中释放内存。

注意注意

SQL Server 并不一定分配 min server memory 指定的内存量。如果服务器上的负荷从不需要分配 min server memory 指定的内存量,则 SQL Server 将以较少的内存运行。

max server memory 避免了 SQL Server 缓冲池使用的内存量多于指定的内存量,这样剩余的可用内存可以用来快速启动其他应用程序。SQL Server 不会在启动时立即分配 max server memory 指定的内存量。SQL Server 会根据需要增加内存使用量,直到内存使用量达到 max server memory 中指定的值。除非增加 max server memory 的值,否则 SQL Server 无法超过此内存使用量。

在减小 max server memory 值之前,请在加载时使用性能监视器来检查 SQLServer:Buffer Manager 性能对象,并注意 Stolen pagesReserved pages 计数器的当前值。这些计数器将内存报告为 8K 页的数目。应将 max server memory 设置为大于这两个值的和,以免出现内存不足错误。对于合理的最低 max server memory 设置(以 MB 为单位),近似值是 ([Stolen pages] + [Reserved pages])/ 100。若要减小 max server memory,可能需要重新启动 SQL Server 以释放内存。有关如何设置内存选项的信息,请参阅 如何设置固定内存量 (SQL Server Management Studio)

最大化网络应用程序数据吞吐量

若要优化 SQL Server 的系统内存使用情况,应该限制系统用于文件缓存的内存量。若要限制文件系统缓存,请确保未选择**“最大化文件共享数据吞吐量”。通过选择“最小化使用的内存”“平衡”**,可以指定最小文件系统缓存。

检查操作系统的当前设置

  1. 单击**“开始”,接着单击“控制面板”,然后双击“网络连接”,再双击“本地连接”**。

  2. 在**“常规”选项卡上,单击“属性”,选择“Microsoft 网络的文件和打印机共享”,然后单击“属性”**。

  3. 如果选中了**“最大化网络应用程序数据吞吐量”,请任选一个相应的其他选项,单击“确定”**,再关闭其余对话框。

Windows Server 2003 中的 AWE 内存

在 Windows Server 2003 中,SQL Server 可以使用地址窗口化扩展插件 (AWE) 内存进一步协助其自身内存要求与操作系统的内存要求之间的负荷平衡。SQL Server 和操作系统之间的这种平衡受 min server memorymax server memory 选项的限制。如果服务器硬件支持热添加内存,可以根据需要向该服务器添加其他物理内存,而无需重新启动。有关 awe enabled 配置选项的详细信息,请参阅 awe enabled 选项。有关详细信息,请参阅热添加内存

注意注意

物理内存低于配置的虚拟内存限制的服务器支持动态 AWE 内存。

理想情况下,在不引起系统交换页面到磁盘的前提下,应尽可能多地分配内存给 SQL Server。该阈值因系统而异。例如,在 SQL Server 专用的 32 GB 系统上,30-31 GB 可能就是 SQL Server 的适当的最大阈值;在 64 GB 系统上,60-62 GB 可能是适当的阈值。

注意注意

当增大 SQL Server 内存量时,应确保有足够的磁盘空间来扩展操作系统的虚拟内存支持文件 (Pagefile.sys) 以容纳更多内存。有关虚拟内存支持文件的详细信息,请参阅 Windows 文档。

必要时,可以使用 Windows 系统监视器中的统计信息帮助您调整内存值。应该仅在添加或减少内存时或者改变系统使用方式时改变该值。

虚拟内存管理器

在 32 位操作系统中,可以访问 4 GB 的虚拟地址空间。2 GB 的虚拟内存专用于进程,由应用程序使用。2 GB 保留给操作系统使用。所有操作系统版本都包含一个开关,该开关允许应用程序访问多达 3 GB 的虚拟内存,从而将操作系统使用的内存限制为 1 GB。有关如何使用开关内存配置的详细信息,请参阅介绍 4 GB 优化的 Windows 文档。当 32 位 SQL Server 运行在 64 位操作系统上时,其用户可用虚拟地址空间为整个 4 GB。

注意注意

仅当服务器使用热添加内存设备时,PAE 才会自动启用。在这种情况下,您不必在配置为使用热添加内存设备的系统中使用 /PAE 开关。而在其他任何情况下,都必须在 Boot.ini 文件中使用 /PAE 开关才能利用超过 4 GB 的内存。

4 GB 的地址空间由 Windows 虚拟内存管理器 (VMM) 映射到可用的物理内存。因此,AWE 可访问的物理内存量取决于使用的操作系统。有关不同操作系统所支持的物理内存量的详细信息,请参阅 Windows 文档“Windows 版本的内存限制”。

虚拟地址系统允许虚拟内存超过物理内存,这样虚拟内存与物理内存的比率可以大于 1:1。因此,大型程序在计算机上运行时具有多种物理内存配置。但是,使用比所有进程的平均组合工作集大得多的虚拟内存可能会导致性能降低。

min server memorymax server memory 选项都是高级选项。如果使用 sp_configure 系统存储过程来更改这些设置,则只有在 show advanced options 设置为 1 时才能更改它们。这些设置更改后会立即生效,不需要重新启动服务器。

运行多个 SQL Server 实例

当运行多个数据库引擎实例时,可以使用三种方法来管理内存:

  • 使用 max server memory 控制内存使用量。为每个实例建立最大设置,注意总的允许设置值不能大于计算机上的物理总内存。可能需要为每个实例提供与预期的工作负荷或数据库大小成正比的内存。这种方法的优势体现在:当启动新的进程或实例时,可以立即为这些进程或实例提供可用内存。这种方法的缺点为:如果没有运行所有实例,则所有运行中的实例都无法使用剩余的可用内存。

  • 使用 min server memory 控制内存使用量。为每个实例建立最小设置,以使这些最小值的和比计算机上总的物理内存小 1-2 GB。此外,可能需要建立与该实例的预期负荷成正比的最小值。这种方法的优势体现在:如果没有同时运行所有实例,则运行中的实例可以使用剩余的可用内存。当计算机上存在其他占用大量内存的进程时,这种方法也十分有用,因为它可确保 SQL Server 至少获得合理的内存量。这种方法的缺点为:当启动新的进程(或任何其他进程)时,它可能会花费一些时间运行实例以释放内存,如果实例必须将修改后的页写回到数据库中来释放内存,则花费的时间可能会更长。还可能需要显著增大分页文件的大小。

  • 不执行任何操作(不推荐)。带有工作负荷的第一个实例通常分配所有的内存。稍后启动的空闲实例最终可能会只使用最少的可用内存量运行。SQL Server 不会尝试均衡分配各个实例的内存使用量。但是,所有实例都将响应 Windows 内存通知信号以调整其缓冲池的大小。Windows 不会使用内存通知 API 来平衡各个应用程序使用的内存。它只提供有关系统内存可用性的全局反馈。

您可以在不重新启动实例的情况下更改这些设置,以便可以轻松地进行尝试以找到适用于您使用模式的最佳设置。

示例

以下示例将 max server memory 选项设置为 4 GB:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO