sys.dm_db_xtp_table_memory_stats (Transact-SQL)
適用於:SQL Server
Azure 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