@AaronBertrand 是正确的。您无法真正获得那种粒度数据。您可以查看环形缓冲区,看看是否可以找到您感兴趣的任何统计信息,但这些是事件驱动的,不一定可以过滤到您正在寻找的时间精度。我只是稍微修改了 Jonathan Kehayias 的内存压力查询。它可能对您有用,也可能没有用,但是,正如我指出的那样,Aaron 的回答是正确的。
SELECT
EventTime,
record.value('(/Record/ResourceMonitor/Notification)[1]', 'varchar(max)') as [Type],
record.value('(/Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') as [IndicatorsProcess],
record.value('(/Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') as [IndicatorsSystem],
record.value('(/Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [Avail Phys Mem, Kb],
record.value('(/Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [Total Phys Mem, Kb],
record.value('(/Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [Avail VAS, Kb],
record.value('(/Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [Avail VAS, Kb]
FROM (
SELECT
DATEADD (ss, (-1 * ((cpu_ticks / CONVERT (float, ( cpu_ticks / ms_ticks ))) - [timestamp])/1000), GETDATE()) AS EventTime,
CONVERT (xml, record) AS record
FROM sys.dm_os_ring_buffers
CROSS JOIN sys.dm_os_sys_info
WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR') AS tab
ORDER BY EventTime DESC;
您可以随时运行
DBCC MEMORYSTATUS
(或者最好查看 sys.dm_os_memory* DMV)。至于从一个小时前获取数据,这需要使用监视工具、MDW 等进行某种收集。SQL Server 不会一直保留内存使用情况的快照——这会变得非常昂贵。
@AaronBertrand 是正确的。您无法真正获得那种粒度数据。您可以查看环形缓冲区,看看是否可以找到您感兴趣的任何统计信息,但这些是事件驱动的,不一定可以过滤到您正在寻找的时间精度。我只是稍微修改了 Jonathan Kehayias 的内存压力查询。它可能对您有用,也可能没有用,但是,正如我指出的那样,Aaron 的回答是正确的。