我正在对我的数据库进行压力测试,该数据库托管在 SQL Server 2008 64 位上,运行在具有 10 GB RAM 的 64 位机器上。
我有 400 个线程。每个线程每秒查询一次数据库,但查询时间并不像 SQL 分析器所说的那样花费时间,但 18 小时后 SQL Server 会占用 7.2 GB 的 RAM 和 7.2 GB 的虚拟内存。
这是正常行为吗?如何调整 SQL Server 以清理未使用的内存?
我正在对我的数据库进行压力测试,该数据库托管在 SQL Server 2008 64 位上,运行在具有 10 GB RAM 的 64 位机器上。
我有 400 个线程。每个线程每秒查询一次数据库,但查询时间并不像 SQL 分析器所说的那样花费时间,但 18 小时后 SQL Server 会占用 7.2 GB 的 RAM 和 7.2 GB 的虚拟内存。
这是正常行为吗?如何调整 SQL Server 以清理未使用的内存?
SQL Server 旨在使用尽可能多的内存,通过在内存中缓存大量内容来提高性能。建议为 SQL Server 使用专用机器,这使得这是一种完全有效的方法,因为它不期望其他任何人需要内存。所以你不应该担心这个;这是完全正常的。
也就是说,如果您使用的是开发机器而不是实时环境,您可能希望限制内存量以阻止您的机器被接管。在这种情况下,最简单的方法是打开 SQL Server Management Studio,右键单击服务器并选择“属性”,然后在“内存”选项卡上可以设置最大服务器内存。
实际上,有一个巧妙的小技巧可以得到你想要的东西。问题/问题是如何让SQL Server“暂时”放弃它可能不需要的内存,然后让它根据需要重新使用它。
为此,请运行以下脚本:
EXEC sys.sp_configure N'show advanced options', N'1'
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'{low water mark}'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'{High water mark}'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0'
RECONFIGURE WITH OVERRIDE
GO
输入您自己的 {low water mark} 和 {high water mark} 值(以 MB 为单位)。
这将强制内存减少到最小数量,然后如果 SQL Server 需要/想要它,则立即再次打开它。
唯一剩下要做的就是安排脚本定期运行。
推荐:
如果 SQL Server 没有大量使用,请尝试每 6 小时自动运行一次。如果它被大量使用,则每 24 小时运行一次(比如在半夜或一天开始之前)。您的使用情况会有所不同。
离开 Greg 的回答,当您配置内存时,请尝试为操作系统留出至少 10% 的可用内存。如果 SQL 在长查询中失控,您希望该缓冲能够远程进入并仍然管理该框。
http://support.microsoft.com/kb/961323
我认为这是解决此问题的方法。它建议进行累积更新。 http://hotfixv4.microsoft.com/SQL%20Server%202008/nosp/SQL_Server_2008_Cumulative_Update_3/10.00.1787.00/free/370328_intl_x64_zip.exe