今天我的一个朋友问我(试图平息他一位焦躁不安的客户)如何才能在 SQL Server 2005 中找出哪个数据库在任意给定时间使用了多少内存(即服务器的 RAM 中)。
这有可能吗?如果可以,怎么做?您可以使用内置的 SQL Server 工具执行此操作吗,还是需要额外的第三方选项?
他的客户非常慌乱,因为他专用的 SQL Server 计算机突然使用了 4 GB 内存中的 200KB 左右。我认为这其实不是问题 - 但由于这个人声称这几乎是在一夜之间发生的,他想知道是什么导致了内存使用量的增加......
马克
答案1
这很可能是由于查询想要将更多页面读入缓冲池,而缓冲池需要占用更多内存来满足这一要求。这就是 SQL Server 的工作方式。如果该框遇到内存压力,它将要求 SQL Server 放弃一些内存,它会这样做。客户不必担心。
您可以使用 DMVsys.dm_os_buffer_descriptors
查看哪个数据库使用了多少缓冲池内存。此代码片段将告诉您每个数据库的缓冲池中有多少干净页和脏页(自上次检查点或从磁盘读取以来进行了修改)。您可以进一步修改。
SELECT
(CASE WHEN ([is_modified] = 1) THEN 'Dirty' ELSE 'Clean' END) AS 'Page State',
(CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
COUNT (*) AS 'Page Count'
FROM sys.dm_os_buffer_descriptors
GROUP BY [database_id], [is_modified]
ORDER BY [database_id], [is_modified];
GO
我在这篇博文中对此进行了进一步的解释存储引擎内部:缓冲池里有什么?
您还可以查看 KB 907877(如何使用 DBCC MEMORYSTATUS 命令监视 SQL Server 2005 上的内存使用情况),它将让您了解 SQL Server 其余内存使用情况的细目分类(但不是每个数据库的)。
希望这可以帮助!
答案2
您的朋友还可以限制 SQL 占用的 RAM 量,因为正如 Paul 上面所述,SQL 会占用其所能占用的每一点内存。
将 SQL Server 占用的内存量限制为 2000 Mb(或您认为最佳的值)。
--Enable advanced options:
USE master
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
--Set the maximum amount of memory to 2000 MB:
USE master
EXEC sp_configure 'max server memory (MB)', 2000
RECONFIGURE WITH OVERRIDE
--Display the newly set configuration:
USE master
EXEC sp_configure 'max server memory (MB)'
--Set 'show advanced options' back to default:
USE master
EXEC sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE