sys.dm_db_xtp_table_memory_stats(Transact-SQL)

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

返回当前数据库中每个内存中 OLTP 表(用户和系统)的内存使用情况统计信息。 系统表具有负对象 ID,用于存储内存中 OLTP 引擎的运行时信息。 与用户对象不同,系统表是内部的,并且只存在于内存中,因此,通过目录视图看不到它们。 系统表用于存储存储中所有数据/增量文件的元数据、合并请求、增量文件的水印来筛选行、删除的表以及恢复和备份的相关信息。 鉴于内存中 OLTP 引擎最多可以有 8,192 个数据和增量文件对,对于大型内存中数据库,系统表占用的内存可能为几兆字节。

有关详细信息,请参阅 内存中 OLTP(内存中优化)

列名称 数据类型 说明
object_id int 表的对象 ID。 NULL 用于内存中 OLTP 系统表。
memory_allocated_for_table_kb bigint 为此表分配的内存。
memory_used_by_table_kb bigint 表使用的内存,包括行版本。
memory_allocated_for_indexes_kb bigint 为此表中的索引分配的内存。
memory_used_by_indexes_kb bigint 此表中的索引占用的内存。

权限

如果你在当前数据库上拥有 VIEWDATABASE STATE 权限,所有行都会返回。 否则,将返回一个空行集。

如果您没有 VIEWDATABASE 权限,所有列将返回您拥有SELECT权限的表格行。

系统表仅对拥有 VIEWDATABASE STATE权限的用户返回。

SQL Server 2022 及更高版本的权限

需要 VIEWDATABASE 数据库中的PERFORMANCE STATE权限。

示例

您可以查询以下 DMV 以获取在数据库内为表和索引分配的内存:

-- finding memory for objects  
SELECT OBJECT_NAME(object_id), *   
FROM sys.dm_db_xtp_table_memory_stats;  

在数据库中查找所有对象的内存:

SELECT SUM( memory_allocated_for_indexes_kb + memory_allocated_for_table_kb) AS  
 memoryallocated_objects_in_kb   
FROM sys.dm_db_xtp_table_memory_stats;  

使用方案

首先,将最大服务器内存设置为 4GB 作为安全措施。 你可能希望为环境考虑不同的值。

-- set max server memory to 4 GB  
EXEC sp_configure 'max server memory (MB)', 4048  
go  
  
RECONFIGURE  
go  

为包含内存优化对象的数据库创建资源池。

-- create a resource pool for the database with memory-optimized objects  
CREATE RESOURCE POOL PoolHkDb1 WITH (MAX_MEMORY_PERCENT = 50);  
ALTER RESOURCE GOVERNOR RECONFIGURE;  
go  

将资源池“PoolHkdb1”绑定到数据库“HkDb1”。 这需要使数据库脱机/联机才能关联池。

--bind the pool to the database  
EXEC sp_xtp_bind_db_resource_pool 'HkDb1', 'PoolHkdb1'  
go  
  
-- take database offline/online to associate the pool  
use master  
go  
  
alter database HkDb1 set offline  
go  
alter database HkDb1 set online  
go  

在名为 HkDb1 的数据库中创建下表。

USE HkDb1  
GO
  
CREATE TABLE dbo.t1 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t1_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 100000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO
  
CREATE TABLE dbo.t2 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t2_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 100000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
GO  
  
CREATE TABLE dbo.t3 (  
       c1 int NOT NULL,  
       c2 char(40) NOT NULL,  
       c3 char(8000) NOT NULL,  
  
       CONSTRAINT [pk_t3_c1] PRIMARY KEY NONCLUSTERED HASH (c1) WITH (BUCKET_COUNT = 1000000)  
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)  
GO

将数据加载到表中。

-- load 150K rows  
DECLARE @i int = 0  
WHILE (@i <= 150000)  
BEGIN  
       insert t1 values (@i, 'a', replicate ('b', 8000))  
       set @i += 1;  
END  
GO  

将数据加载到表中后,可看到用户定义的表及其使用的存储容量。 例如,表的每行可能大约为 8070 个字节(分配大小为 8K(8192 个字节))。 可查看每个表的索引数以及这些索引使用的存储容量。 例如,1MB 为每个 100K 条目舍入到 2 的下一次幂 (2**17) = 131072,每个为 8 字节。 表可以没有某个索引,在这种情况下,它将显示该索引的内存分配。 其他行可代表系统表

select convert(char(10), object_name(object_id)) as Name,*   
from sys.dm_db_xtp_table_memory_stats;

下面是输出,分为两部分:

Name       object_id   memory_allocated_for_table_kb memory_used_by_table_kb  
---------- ----------- ----------------------------- -----------------------  
t3         629577281   0                             0  
t1         565577053   1372928                       1202351  
t2         597577167   0                             0  
NULL       -6          0                             0  
NULL       -5          0                             0  
NULL       -4          0                             0  
NULL       -3          0                             0  
NULL       -2          192                           25  
  
memory_allocated_for_indexes_kb memory_used_by_indexes_kb  
------------------------------- -------------------------  
8192                            8192  
1024                            1024  
8192                            8192  
2                               2  
24                              24  
2                               2  
2                               2  
16                              16  

以下部分

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  
-------------------- --------------------  
1357                 1191  

接下来,让我们看一看来自资源池的输出。 请注意,池中使用的内存为 1356 MB。

select pool_id,convert(char(10), name) as Name, min_memory_percent, max_memory_percent,   
   max_memory_kb/1024 as max_memory_mb  
from sys.dm_resource_governor_resource_pools; 
  
select used_memory_kb/1024 as used_memory_mb ,target_memory_kb/1024 as target_memory_mb  
from sys.dm_resource_governor_resource_pools;

输出:

pool_id     Name       min_memory_percent max_memory_percent max_memory_mb  
----------- ---------- ------------------ ------------------ --------------------  
1           internal   0                  100                3845  
2           default    0                  100                3845  
259         PoolHkDb1  0                  100                3845  
  
used_memory_mb       target_memory_mb  
-------------------- --------------------  
125                  3845  
32                   3845  
1356                 3845