sys.memory_optimized_tables_internal_attributes (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) und höher Azure SQL-Datenbank Azure SQL verwaltete Instanz

Enthält eine Zeile für jede interne speicheroptimierte Tabelle, die zum Speichern von speicheroptimierten Benutzertabellen verwendet wird. Jede Benutzertabelle entspricht mindestens einer internen Tabelle. Eine einzelne Tabelle wird für die Speicherung von Kerndaten verwendet. Zusätzliche interne Tabellen werden für die Unterstützung von Funktionen wie dem temporalen Columnstore-Index und die Speicherung außerhalb von Zeilen (LOB) für speicheroptimierte Tabellen verwendet.

Spaltenname Datentyp BESCHREIBUNG
object_id int Die ID der Benutzertabelle. Interne speicheroptimierte Tabellen, die der Unterstützung einer Benutzertabelle dienen (wie etwa Speicherung außerhalb der Zeile oder gelöschte Zeilen im Fall von Hk/Columnstore-Kombinationen), weisen die gleiche object_id wie ihr übergeordnetes Objekt auf.
xtp_object_id bigint In-Memory-OLTP-Objekt-ID, die der internen speicheroptimierten Tabelle entspricht, die für die Unterstützung der Benutzertabelle verwendet wird. Sie ist innerhalb der Datenbank eindeutig und kann sich im Lauf der Lebensspanne des Objekts ändern.
Typ int Der Typ der internen Tabelle.

0 => DELETED_ROWS_TABLE
1 => USER_TABLE
2 => DICTIONARIES_TABLE
3 => SEGMENTS_TABLE
4 => ROW_GROUPS_INFO_TABLE
5 => INTERNE DATENTABELLE AUßERHALB DER ZEILE
252 => INTERNAL_TEMPORAL_HISTORY_TABLE
type_desc nvarchar(60) Beschreibung des Typs

DELETED_ROWS_TABLE –> Interne Tabellennachverfolgung gelöschter Zeilen für einen Spaltenspeicherindex
USER_TABLE –> Tabelle mit den In-Row-Benutzerdaten
DICTIONARIES_TABLE –> Wörterbücher für einen Columnstore-Index
SEGMENTS_TABLE –> Komprimierte Segmente für einen Spaltenspeicherindex
ROW_GROUPS_INFO_TABLE –> Metadaten zu komprimierten Zeilengruppen eines Spaltenspeicherindexes
INTERNAL OFF-ROW DATA TABLE –> Interne Tabelle, die für die Speicherung einer Off-Row-Spalte verwendet wird. In diesem Fall gibt minor_id die column_id an.
INTERNAL_TEMPORAL_HISTORY_TABLE –> Hot Tail der datenträgerbasierten Verlaufstabelle. Zeilen, die in den Verlauf eingefügt werden, werden zuerst in diese interne speicheroptimierte Tabelle eingefügt. Eine Hintergrundaufgabe verschiebt asynchron Zeilen aus dieser internen Tabelle in die datenträgerbasierte Verlaufstabelle.
minor_id int 0 gibt eine Benutzer- oder eine interne Tabelle an

Ein anderer Wert als 0 gibt die ID einer außerhalb von Zeilen gespeicherten Spalte an. Joins mit column_id in sys.columns.

Jeder außerhalb von Zeilen gespeicherten Spalte entspricht eine Zeile in dieser Systemansicht.

Berechtigungen

Die Sichtbarkeit der Metadaten in Katalogsichten ist auf sicherungsfähige Elemente eingeschränkt, bei denen der Benutzer entweder der Besitzer ist oder für die dem Benutzer eine Berechtigung erteilt wurde. Weitere Informationen finden Sie unter Metadata Visibility Configuration.

Beispiele

A. Zurückgeben aller Spalten, die außerhalb von Zeilen gespeichert sind

Das folgende T-SQL-Skript veranschaulicht eine Tabelle mit mehreren großen Spalten, die nicht vom LOB-Typ sind, und einer einzelnen LOB-Spalte:

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

Die folgende Abfrage zeigt alle Spalten, die außerhalb der Zeile gespeichert sind, zusammen mit ihrer Größe. Eine Größe von-1 gibt eine LOB-Spalte an. Alle LOB-Spalten werden außerhalb von Zeilen gespeichert.

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. Zurückgeben des Speicherverbrauchs aller Spalten, die außerhalb von Zeilen gespeichert sind

Um mehr Details zum Speicherverbrauch von außerhalb von Zeilen gespeicherten Spalten abzurufen, können Sie die folgende Abfrage verwenden, die den Speicherverbrauch aller internen Tabellen und ihre Indizes angibt, die zum Speichern der Spalten außerhalb von Zeilen verwendet werden:

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. Zurückgeben des Speicherverbrauches von Columnstore-Indizes für speicheroptimierte Tabellen

Verwenden Sie die folgende Abfrage, um den Speicherverbrauch von Spaltenspeicherindizes für speicheroptimierte Tabellen anzuzeigen:

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;

Verwenden Sie die folgende Abfrage, um den Speicherverbrauch in internen Strukturen aufzuschlüsseln, die für Spaltenspeicherindizes für speicheroptimierte Tabellen verwendet werden:

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)