sys.dm_os_out_of_memory_events

适用于:Azure SQL 数据库Azure SQL 托管实例

返回一组最近内存不足(OOM)事件。

有关Azure SQL 数据库内存不足情况的详细信息,请参阅Azure SQL 数据库中的内存不足错误疑难解答。

列名称 数据类型 描述
event_time 日期/时间 OOM 事件时间。 不可为 null。
oom_cause tinyint 指示 OOM 根本原因的数值。 OOM 原因由启发式算法确定,并提供有限的置信度。 不可为 null。
oom_cause_desc nvarchar(30) oom_cause说明。 不可为 null。
0. UNKNOWN - 无法确定 OOM 原因
1. HEKATON_POOL_MEMORY_LOW - 资源池中用于内存中 OLTP 的内存不足。 有关详细信息,请参阅 “监视内存中 OLTP”。
2. MEMORY_LOW - 数据库引擎进程可用的内存不足
3. OS_MEMORY_PRESSURE - 由于作系统的外部内存压力,OOM
4. OS_MEMORY_PRESSURE_SQL - 由于来自其他数据库引擎实例的外部内存压力,OOM
5. NON_SOS_MEMORY_LEAK - OOM 由于非 SOS 内存中泄漏,例如加载的模块
6. SERVERLESS_MEMORY_RECLAMATION - 与无服务器数据库中的内存回收相关的 OOM
7. MEMORY_LEAK - OOM 由于 SOS 内存中泄漏
8. SLOW_BUFFER_POOL_SHRINK - 由于缓冲池在内存压力下释放内存的速度不够快,OOM
9. INTERNAL_POOL - 内部资源池中的内存不足
10. SYSTEM_POOL - 系统资源池中的内存不足
11. QUERY_MEMORY_GRANTS - 由于查询持有的内存授予较大,OOM
12. REPLICAS_AND_AVAILABILITY - SloSecSharedPool 资源池中工作负荷导致的 OOM
available_physical_memory_mb int 可用物理内存(以兆字节为单位)。 不可为 null。
initial_job_object_memory_limit_mb int 数据库引擎启动时的作业对象内存限制(以 MB 为单位)。 有关作业对象的详细信息,请参阅 资源治理。 可以为 NULL。
current_job_object_memory_limit_mb int 作业对象当前内存限制(以兆字节为单位)。 可以为 NULL。
process_memory_usage_mb int 实例的总进程内存使用量(以兆字节为单位)。 不可为 null。
non_sos_memory_usage_mb int 非 SOS 使用量(以兆字节为单位),包括 SOS 创建的线程、非 SOS 组件创建的线程、加载的 DLL 等。不可为 null。
committed_memory_target_mb int SOS 以兆字节为单位的目标内存。 不可为 null。
committed_memory_mb int SOS 提交的内存(以兆字节为单位)。 不可为 null。
allocation_potential_memory_mb int 可用于数据库引擎实例的新分配的内存(以 MB 为单位)。 不可为 null。
oom_factor tinyint 一个值,提供与 OOM 事件相关的其他信息,仅供内部使用。 不可为 null。
oom_factor_desc nvarchar(30) oom_factor说明。 仅限内部使用。 不可为 null。
0 - UNDEFINED
1 - ALLOCATION_POTENTIAL
2 - BLOCK_ALLOCATOR
3 - ESCAPE_TIMEOUT
4 - FAIL_FAST
5 - MEMORY_POOL
6 - EMERGENCY_ALLOCATOR
7 - VIRTUAL_ALLOC
8 - SIMULATED
9 - BUF_ALLOCATOR
10 - QUERY_MEM_QUEUE
11 - FRAGMENT
12 - INIT_DESCRIPTOR
13 - MEMORY_POOL_PRESSURE
14 - DESCRIPTOR_ALLOCATOR
15 - DESCRIPTOR_ALLOCATOR_ESCAPE
oom_resource_pools nvarchar(4000) 内存不足的资源池,包括每个池的内存使用情况统计信息。 此信息以 JSON 值的形式提供。 可以为 NULL。
top_memory_clerks nvarchar(4000) 内存消耗量最高的内存职员,包括每个职员的内存使用情况统计信息。 此信息以 JSON 值的形式提供。 可以为 NULL。
top_resource_pools nvarchar(4000) 按内存消耗列出的顶级资源池,包括每个资源池的内存使用情况统计信息。 此信息以 JSON 值的形式提供。 可以为 NULL。
possible_leaked_memory_clerks nvarchar(4000) 已泄漏内存的内存职员。 基于启发式,并提供有限的置信度。 此信息以 JSON 值的形式提供。 可以为 NULL。
possible_non_sos_leaked_memory_mb int 泄露的非 SOS 内存(如果有)。 基于启发式,并提供有限的置信度。 可以为 NULL。

权限

在Azure SQL 托管实例,需要VIEW SERVER PERFORMANCE STATE权限。

在 SQL 数据库“基本”、“S0”和“S1”服务目标中,对于“弹性池”中的数据库,服务器管理员帐户、Microsoft Entra 管理员帐户或 ##MS_ServerPerformanceStateReader##服务器角色中的成员身份为必填项。 对于所有其他 SQL 数据库服务目标,需要数据库的 VIEW DATABASE PERFORMANCE STATE 权限或 ##MS_ServerPerformanceStateReader## 服务器角色中的成员身份。

注解

此视图中的每一行表示数据库引擎中发生的内存不足(OOM)事件。 并非所有 OOM 事件都可以捕获。 随着最近的 OOM 事件发生,较旧的 OOM 事件可能会从结果集中消失。 在数据库引擎重启后,不会保留结果集。

目前,SQL Server 2022 (16.x) 和 SQL Server 2025 (17.x) 预览版不支持此 DMV。

summarized_oom_snapshot扩展事件

summarized_oom_snapshot扩展事件是事件会话的system_health一部分,用于简化内存不足事件的检测。 每个summarized_oom_snapshot扩展事件对应于一行。sys.dm_os_out_of_memory_events 有关详细信息,请参阅博客文章:排查数据库引擎中内存不足错误的新方法

例子

答: 获取所有可用的 OOM 事件

以下示例返回托管当前已连接数据库的数据库引擎最近一次排序的所有事件数据。

SELECT *
FROM sys.dm_os_out_of_memory_events
ORDER BY event_time DESC;

B. 获取每个 OOM 事件的顶级内存职员

以下示例返回事件数据的子集,并展开列中的 JSON 数据 top_memory_clerks 。 结果集中的每一行代表特定 OOM 事件的顶级内存 clerk。

SELECT event_time,
       oom_cause_desc,
       oom_factor_desc,
       oom_resource_pools,
       top_resource_pools,
       clerk_type_name,
       clerk_page_allocated_mb,
       clerk_vm_committed_mb
FROM sys.dm_os_out_of_memory_events
CROSS APPLY OPENJSON(top_memory_clerks)
                    WITH (
                         clerk_type_name sysname '$.clerk_type_name',
                         clerk_page_allocated_mb bigint '$.page_allocated_mb',
                         clerk_vm_committed_mb bigint '$.vm_committed_mb'
                         )
ORDER BY event_time DESC, clerk_page_allocated_mb DESC;

C. 获取每个 OOM 事件的首要资源池

以下示例返回事件数据的子集,并展开列中的 JSON 数据 top_resource_pools 。 结果集中的每一行都表示特定 OOM 事件的顶级资源池。

SELECT event_time,
       oom_cause_desc,
       oom_factor_desc,
       oom_resource_pools,
       top_memory_clerks,
       pool_name,
       pool_allocations_mb,
       pool_target_mb,
       pool_is_oom
FROM sys.dm_os_out_of_memory_events
CROSS APPLY OPENJSON(top_resource_pools)
                    WITH (
                         pool_name sysname '$.pool_name',
                         pool_allocations_mb bigint '$.allocations_mb',
                         pool_target_mb bigint '$.pool_target_mb',
                         pool_is_oom bit '$.is_oom'
                         )
ORDER BY event_time DESC, pool_allocations_mb DESC;