分享方式:


sys.memory_optimized_tables_internal_attributes (Transact-SQL)

適用於:SQL Server 2016 (13.x) 和更新版本的 Azure SQL 資料庫 Azure SQL 受控執行個體

針對用於儲存使用者記憶體優化數據表的每個內部記憶體優化數據表,各包含一個數據列。 每個用戶數據表對應至一或多個內部數據表。 單一數據表用於核心數據記憶體。 額外的內部數據表可用來支援記憶體優化數據表的時態性、數據行存放區索引和異列 (LOB) 記憶體等功能。

資料行名稱 資料類型 描述
object_id int 用戶數據表的識別碼。 存在於支援用戶數據表的內部記憶體優化數據表(例如,如果 Hk/Columnstore 組合中為卸除數據列儲存或刪除的數據列),其object_id與父數據表相同。
xtp_object_id bigint 記憶體內部 OLTP 物件識別碼,對應至用來支援用戶數據表的內部記憶體優化數據表。 它在資料庫內是唯一的,而且可以在 物件的存留期內變更。
type int 內部數據表的類型。

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => 內部 OFF-ROW 數據表
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) 類型的描述

DELETED_ROWS_TABLE -> 資料行存放區索引的內部資料表追蹤已刪除數據列
USER_TABLE -> 包含數據列用戶數據的數據表
DICTIONARIES_TABLE -> 資料行存放區索引的字典
SEGMENTS_TABLE -> 資料行存放區索引的壓縮區段
ROW_GROUPS_INFO_TABLE -> 資料行存放區索引之壓縮數據列群組的相關元數據
INTERNAL OFF-ROW DATA TABLE -> 用於儲存 off-row 數據行的內部數據表。 在此情況下,minor_id反映column_id。
INTERNAL_TEMPORAL_HISTORY_TABLE -> 磁碟型記錄數據表的熱尾。 插入歷程記錄的數據列會先插入這個內部記憶體優化數據表中。 有一項背景工作會以異步方式將數據列從這個內部數據表移至以磁碟為基礎的記錄數據表。
minor_id int 0 表示使用者或內部數據表

非 0 表示儲存非數據列之數據行的識別碼。 與 sys.columns 中的column_id聯結。

儲存非數據列的每個數據行在此系統檢視中都有對應的數據列。

權限

目錄檢視中元數據的可見度僅限於用戶擁有的安全性實體,或用戶獲授與某些許可權的安全性實體。 如需相關資訊,請參閱 Metadata Visibility Configuration

範例

A. 傳回儲存非數據列的所有數據行

下列 T-SQL 腳本說明具有多個大型非 LOB 數據行和單一 LOB 資料行的數據表:

CREATE TABLE dbo.LargeTableSample
(
      Id   int IDENTITY PRIMARY KEY NONCLUSTERED,
      C1   nvarchar(4000),
      C2   nvarchar(4000),
      C3   nvarchar(4000),
      C4   nvarchar(4000),
      Misc nvarchar(max)
) WITH (MEMORY_OPTIMIZED = ON);
GO

下列查詢顯示儲存於非數據列的所有數據行及其大小。 大小 -1 表示 LOB 資料行。 所有 LOB 資料行都會 off-row 儲存。

SELECT 
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table', 
  c.name AS 'column', 
  c.max_length
FROM sys.memory_optimized_tables_internal_attributes moa
     JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
     JOIN sys.objects o on moa.object_id=o.object_id 
WHERE moa.type=5;

B. 傳回儲存非數據列之所有數據行的記憶體耗用量

若要取得有關非數據列數據行記憶體耗用量的更多詳細數據,您可以使用下列查詢來顯示所有內部數據表及其索引的記憶體耗用量,這些索引是用來儲存非數據列數據行:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  c.name AS 'column',
  c.max_length,
  mc.memory_consumer_desc,
  mc.index_id,
  mc.allocated_bytes,
  mc.used_bytes
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.columns c ON moa.object_id = c.object_id AND moa.minor_id=c.column_id
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id 
WHERE moa.type=5;

C. 傳回記憶體優化數據表上數據行存放區索引的記憶體耗用量

使用下列查詢來顯示記憶體最佳化資料表上資料行存放區索引的記憶體耗用量:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  i.name AS 'columnstore index',
  SUM(mc.allocated_bytes) / 1024 as [allocated_kb],
  SUM(mc.used_bytes) / 1024 as [used_kb]
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.indexes i ON moa.object_id = i.object_id AND i.type in (5,6)
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id
WHERE moa.type IN (0, 2, 3, 4)
GROUP BY o.schema_id, moa.object_id, i.name;

使用下列查詢可細分記憶體最佳化資料表上用於資料行存放區索引的內部結構記憶體耗用量:

SELECT
  QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(OBJECT_NAME(moa.object_id)) AS 'table',
  i.name AS 'columnstore index',
  moa.type_desc AS 'internal table',
  mc.index_id AS 'index',
  mc.memory_consumer_desc,
  mc.allocated_bytes / 1024 as [allocated_kb],
  mc.used_bytes / 1024 as [used_kb]
FROM sys.memory_optimized_tables_internal_attributes moa
   JOIN sys.indexes i ON moa.object_id = i.object_id AND i.type in (5,6)
   JOIN sys.dm_db_xtp_memory_consumers mc ON moa.xtp_object_id=mc.xtp_object_id
   JOIN sys.objects o on moa.object_id=o.object_id
WHERE moa.type IN (0, 2, 3, 4)