分享方式:


sys.dm_db_xtp_table_memory_stats (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體

傳回目前資料庫中每個記憶體內部 OLTP 資料表 (使用者和系統) 的記憶體使用量統計數據。 系統數據表具有負物件識別碼,可用來儲存記憶體內部 OLTP 引擎的運行時間資訊。 不同於使用者對象,系統數據表是內部資料表,而且只存在於記憶體內部,因此無法透過目錄檢視來顯示它們。 系統數據表可用來儲存記憶體中所有數據/差異檔案的元數據、合併要求、差異檔案的浮水印,以篩選數據列、卸除的數據表,以及復原和備份的相關信息。 假設記憶體內部 OLTP 引擎最多可以有 8,192 個數據和差異檔案組,用於大型記憶體內部資料庫,系統數據表所取用的記憶體可能只有幾 MB。

如需詳細資訊,請參閱 In-Memory OLTP (記憶體中最佳化)

資料行名稱 資料類型 描述
object_id int 數據表的物件識別碼。 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 此數據表上索引所耗用的記憶體。

權限

如果您有目前資料庫的 VIEW DATABASE STATE 許可權,則會傳回所有數據列。 否則會傳回空的數據列集。

如果您沒有 VIEW DATABASE 許可權,則會針對您具有 SELECT 許可權之數據表中的數據列傳回所有數據行。

系統數據表只會針對具有 VIEW DATABASE STATE 許可權的用戶傳回。

SQL Server 2022 和更新版本的權限

需要資料庫上的 VIEW DATABASE 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) = 每個位元組 8 個字節131072。 數據表可能沒有索引,在此情況下,它會顯示索引的記憶體配置。 其他數據列可能代表系統數據表

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