sys.dm_db_xtp_memory_consumers (Transact-SQL)
适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
报告内存中 OLTP 数据库引擎中的数据库级内存消耗者。 视图为数据库引擎使用的每个内存消耗者返回一行。 使用此 DMV 查看内存在不同内部对象之间的分布方式。
有关详细信息,请参阅 内存中 OLTP(内存中优化)。
列名称 | 数据类型 | 说明 |
---|---|---|
memory_consumer_id | bigint | 内存消耗者的 ID(内部)。 |
memory_consumer_type | int | 内存消耗者的类型: 0=聚合。 (聚合两个或更多使用者的内存使用量。不应显示它。) 2=VARHEAP(跟踪长度可变的堆的内存占用情况。) 3=HASH(跟踪索引的内存占用情况。) 5 = 数据库页池 (跟踪用于运行时操作的数据库页池的内存消耗。例如,表变量和一些可序列化的扫描。每个数据库只有一个此类型的内存使用者。) |
memory_consumer_type_desc | nvarchar(64) | 内存消耗者的类型:VARHEAP、HASH 或 PGPOOL。 0 - (不应显示它。) 2 - VARHEAP 3 - HASH 5 - PGPOOL |
memory_consumer_desc | nvarchar(64) | 对内存消耗者实例的说明: VARHEAP: 数据库堆。 用于为数据库分配用户数据(行)。 数据库系统堆。 用于分配将包含在内存转储中但不包含用户数据的数据库数据。 范围索引堆。 由范围索引用于分配 BW 页的专用堆。 HASH:没有说明,因为object_id指示表和哈希索引本身index_id。 PGPOOL:对于数据库,只有一个页池数据库 64K 页池。 |
object_id | bigint | 所分配的内存所属的对象 ID。 负值表示系统对象。 |
xtp_object_id | bigint | 内存优化表的对象 ID。 |
index_id | int | 消耗者的索引 ID(如果有)。 NULL 表示基表。 |
allocated_bytes | bigint | 为此消耗者保留的字节数。 |
used_bytes | bigint | 此消耗者使用的字节数。 仅适用于 varheap。 |
allocation_count | int | 分配的数量。 |
partition_count | int | 仅限内部使用。 |
sizeclass_count | int | 仅限内部使用。 |
min_sizeclass | int | 仅限内部使用。 |
max_sizeclass | int | 仅限内部使用。 |
memory_consumer_address | varbinary | 消耗者的内部地址。 仅限内部使用。 |
xtp_object_id | bigint | 与内存优化表相对应的In-Memory OLTP 对象 ID。 |
注解
在输出中,数据库级分配器指用户表、索引和系统表。 VARHEAP with object_id
= NULL
是指分配给具有可变长度列的表的内存。
权限
如果您对当前数据库拥有 VIEW DATABASE STATE 权限,将返回所有行。 否则,将返回一个空行集。
如果您没有 VIEW DATABASE 权限,将为表中您拥有 SELECT 权限的行返回所有列。
只会为拥有 VIEW DATABASE STATE 权限的用户返回系统表。
SQL Server 2022 及更高版本的权限
需要对数据库具有 VIEW DATABASE PERFORMANCE STATE 权限。
一般备注
当内存优化表具有列存储索引时,系统会使用一些内部表来跟踪列存储索引的数据,这些内部表会占用一些内存。 有关这些内部表和显示其内存消耗的示例查询的详细信息,请参阅 sys.memory_optimized_tables_internal_attributes (Transact-SQL) 。
示例
查询当前数据库中的内存使用者。
-- memory consumers (database level)
SELECT OBJECT_NAME(object_id), *
FROM sys.dm_db_xtp_memory_consumers;
使用方案
-- memory consumers (database level)
select convert(char(10), object_name(object_id)) as Name,
convert(char(10),memory_consumer_type_desc ) as memory_consumer_type_desc, object_id,index_id, allocated_bytes, used_bytes
from sys.dm_db_xtp_memory_consumers
下面是包含列子集的输出。 数据库级别的分配器引用用户表、索引和系统表。 具有 object_id
= NULL
最后一行) (VARHEAP 是指分配给表的数据行的内存 (在此处示例中,它 t1
) 。 分配的字节数(转换为 MB)为 1340MB。
Name memory_consumer_type_desc object_id index_id allocated_bytes used_bytes
---------- ------------------------- ----------- ----------- -------------------- --------------------
t3 HASH 629577281 2 8388608 8388608
t2 HASH 597577167 2 8388608 8388608
t1 HASH 565577053 2 1048576 1048576
NULL HASH -6 1 2048 2048
NULL VARHEAP -6 NULL 0 0
NULL HASH -5 3 8192 8192
NULL HASH -5 2 8192 8192
NULL HASH -5 1 8192 8192
NULL HASH -4 1 2048 2048
NULL VARHEAP -4 NULL 0 0
NULL HASH -3 1 2048 2048
NULL HASH -2 2 8192 8192
NULL HASH -2 1 8192 8192
NULL VARHEAP -2 NULL 196608 26496
NULL HASH 0 1 2048 2048
NULL PGPOOL 0 NULL 0 0
NULL VARHEAP NULL NULL 1405943808 1231220560
(17 row(s) affected)
从此 DMV 分配和使用的总内存与 sys.dm_db_xtp_table_memory_stats (Transact-SQL) 中的对象级别相同。
select sum(allocated_bytes)/(1024*1024) as total_allocated_MB,
sum(used_bytes)/(1024*1024) as total_used_MB
from sys.dm_db_xtp_memory_consumers;
total_allocated_MB total_used_MB
-------------------- --------------------
1358 1191