Interne Tabellen

SQL Server erstellt automatisch interne Tabellen zur Unterstützung der folgenden Features:

  • Primäre XML-Indizes

  • Räumliche Indizes

  • Service Broker

  • Abfragebenachrichtigungen

  • Änderungsnachverfolgung

Interne Tabellen sind ein Nebeneffekt von anderen Benutzeraktionen. Wenn Sie beispielsweise einen primären XML-Index erstellen, erstellt SQL Server automatisch eine interne Tabelle zur dauerhaften Aufbewahrung der aufgeteilten XML-Dokumentdaten. Interne Tabellen sind im sys-Schema aller Datenbanken enthalten und weisen eindeutige, systemgenerierte Namen auf, die auf ihre Funktion schließen lassen, wie z. B. xml_index_nodes_2021582240_32001 oder queue_messages_1977058079.

Interne Tabellen enthalten keine Daten, auf die von Benutzern zugegriffen werden kann. Ihre Schemas stehen fest und können nicht geändert werden. Sie können in Transact-SQL-Anweisungen nicht auf interne Tabellennamen verweisen. So können Sie beispielsweise eine Anweisung wie z. B. SELECT * FROM <sys.internal_table_name> nicht ausführen. Sie können Katalogsichten jedoch abfragen, um die Metadaten interner Tabellen anzuzeigen.

Anzeigen der Metadaten interner Tabellen

Sie können die internen Tabellen zugeordneten Metadaten mithilfe der sys.internal_tables-Katalogsicht anzeigen. Mit dieser Sicht kann das Schema interner Tabellen angezeigt werden. Da interne Tabellen viele der gleichen Eigenschaften wie Benutzertabellen besitzen, erbt die sys.internal_tables-Katalogsicht Spalten von der sys.objects-Katalogsicht und weisen den Typ 'IT' auf. Wie bei Benutzertabellen sind Spaltenmetadaten für interne Tabellen in der sys.columns-Katalogsicht sichtbar, während die Metadaten für systemgenerierte Indizes und Statistiken in internen Tabellen in den Katalogsichten sys.indexes und sys.stats sichtbar sind.

Durch Verknüpfen mit anderen Katalogsichten können Informationen über die Zuordnung und Speicherplatznutzung auch abgerufen werden. Weitere Informationen finden Sie unter "Speicherverwendung interner Tabellen" nachfolgend in diesem Thema.

Die folgende Abbildung zeigt das Katalogdatenmodell auf oberster Ebene.

Diagramm der internen Tabellenkatalogsichten

Berechtigungen zum Anzeigen der Metadaten interner Tabellen

Zum Anzeigen der Metadaten interner Tabellen in einer Datenbank benötigen Sie eine der folgenden Berechtigungen oder Gruppenmitgliedschaften:

  • CONTROL SERVER-Berechtigung.

  • CONTROL-Berechtigung in der Datenbank.

  • Die Mitgliedschaft in der db_owner- oder sysadmin-Gruppe.

  • Ein Benutzer, der die übergeordnete Entität (den XML- oder räumlichen Index oder die Warteschlange) anzeigen kann, kann auch die interne Tabelle dieser Entität anzeigen.

Anzeigen der Metadaten von XML-Indizes

In der folgenden Abbildung wird die Metadatenstruktur einer internen Tabelle in einem XML-Index dargestellt.

Diagramm der XML-Indexkatalogsichten

Die in der Abbildung dargestellten Beziehungen zwischen Katalogsichten werden verständlich, wenn Sie von der Annahme ausgehen, dass der primäre XML-Index Xp in Tabelle T erstellt wird. Die Metadaten für die Tabelle befinden sich in der sys.tables-Katalogsicht, und die Metadaten für den XML-Index befinden sich in der sys.xml_indexes-Katalogsicht. Die Metadaten der von SQL Server zum dauerhaften Aufbewahren der XML-Indexdaten erstellten internen Tabelle Ti befinden sich in der sys.internal_tables-Sicht.

Um die Beziehung zwischen der internen Tabelle Ti und der Benutzertabelle T herauszufinden, können Sie die parent_id-Spalte der sys.internal_tables-Sicht mit der object_id-Spalte der sys.tables-Sicht verknüpfen. Um die Beziehung zwischen der internen Tabelle Ti und dem XML-Index Xp herauszufinden, können Sie die Spalten parent_id und parent_minor_id der sys.internal_tables-Sicht mit den Spalten object_id und index_id der sys.xml_indexes-Sicht verknüpfen. Weitere Informationen finden Sie im Beispiel G unten.

Anzeigen der Metadaten von räumlichen Indizes

Die Metadaten von räumlichen Indizes entsprechen weitgehend den Metadaten von XML-Indizes. Der Unterschied besteht darin, dass Räumlichkeitsindizes die sys.spatial_indexes-Sicht anstelle der sys.xml_indexes-Sicht verwenden und zum Anzeigen der räumlichen Parameter für einen räumlichen Index die sys.spatial_index_tessellations-Sicht verwendet werden muss.

In der folgenden Abbildung wird die Metadatenstruktur einer internen Tabelle in einem räumlichen Index dargestellt.

Diagramm der Katalogsichten für Räumlichkeitsindizes

Die in der Abbildung dargestellten Beziehungen zwischen Katalogsichten werden verständlich, wenn Sie von der Annahme ausgehen, dass der räumliche Index Si in Tabelle T erstellt wird. Die Metadaten für die Tabelle befinden sich in der sys.tables-Katalogsicht und die Metadata für den räumlichen Index in der sys.spatial_indexes-Katalogsicht und der sys.spatial_index_tessellations-Katalogsicht. Die Metadaten der von SQL Server zum dauerhaften Aufbewahren der Daten des räumlichen Index erstellten internen Tabelle Ti befinden sich in der sys.internal_tables-Sicht.

Um die Beziehung zwischen der internen Tabelle Ti und der Benutzertabelle T herauszufinden, können Sie die parent_id-Spalte der sys.internal_tables-Sicht mit der object_id-Spalte der sys.tables-Sicht verknüpfen. Um die Beziehung zwischen der internen Tabelle Ti und dem räumlichen Index Si herauszufinden, können Sie die Spalten parent_id und parent_minor_id der sys.internal_tables-Sicht mit den Spalten object_id und index_id der sys.spatial_indexes-Sicht verknüpfen. Weitere Informationen finden Sie weiter unten im Beispiel L.

Anzeigen von Service Broker-Metadaten

In der folgenden Abbildung wird die Metadatenstruktur einer internen Tabelle in einer Service Broker-Warteschlange dargestellt. Service Broker-Nachrichten, -Abfragebenachrichtigungen und -Ereignisbenachrichtigung verwenden Service Broker-Warteschlangen. Darüber hinaus verwendet Service Broker auch eine interne Tabelle zum Speichern von Informationen zu allen Service Broker-Diensten in allen Datenbanken. Diese interne Tabelle befindet sich in der tempdb-Systemdatenbank.

Diagramm der Katalogsichten des Service Brokers

Anzeigen der Metadaten von Abfragebenachrichtigungen

In der folgenden Abbildung wird die Metadatenstruktur einer internen Tabelle in einem Abfragebenachrichtigungsabonnement dargestellt. Interne Tabellen werden zum Speichern der Parameter des Abfragebenachrichtigungsabonnements verwendet.

Diagramm der Katalogsichten für Abfragebenachrichtigungen

Speicherverwendung interner Tabellen

Interne Tabellen werden in dieselbe Dateigruppe wie die übergeordnete Entität platziert. Sie können die in Beispiel F unten dargestellte Katalogabfrage zur Rückgabe der Anzahl von Seiten verwenden, die interne Tabellen für Daten innerhalb und außerhalb von Zeilen sowie LOB-Daten (Large Object) benötigen.

Mithilfe der sp_spaceused-Systemprozedur können Sie Daten zur Speicherverwendung für interne Tabellen zurückgeben. sp_spaceused meldet Speicherplatz in internen Tabellen auf folgende Arten:

  • Wird ein Warteschlangenname angegeben, wird auf die zugrunde liegende interne Tabelle, die der Warteschlange zugeordnet ist, verwiesen und ihre Speicherverwendung gemeldet.

  • Die index_size-Spalte enthält die von den internen Tabellen von XML-Indizes, räumlichen Indizes und Volltextindizes verwendeten Seiten. Wenn der Name einer Tabelle oder indizierten Sicht angegeben wird, sind die Seiten für die XML-Indizes, räumlichen Indizes und Volltextindizes für das Objekt in den Spalten reserved und index_size enthalten.

Beispiele

In den folgenden Beispielen wird die Abfrage von Metadaten interner Tabellen mithilfe von Katalogsichten veranschaulicht.

A. Anzeigen interner Tabellen, die Spalten aus der sys.objects-Katalogsicht erben

SELECT * FROM sys.objects WHERE type = 'IT';

B. Zurückgeben aller Metadaten interner Tabellen (einschließlich der von sys.objects ererbten)

SELECT * FROM sys.internal_tables;

C. Zurückgeben von Spalten und Spaltendatentypen interner Tabellen

SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
    ,itab.name AS internal_table_name
    ,typ.name AS column_data_type 
    ,col.*
FROM sys.internal_tables AS itab
JOIN sys.columns AS col ON itab.object_id = col.object_id
JOIN sys.types AS typ ON typ.user_type_id = col.user_type_id
ORDER BY itab.name, col.column_id;

D. Zurückgeben der Indizes interner Tabellen

SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
    , itab.name AS internal_table_name
    , idx.*
FROM sys.internal_tables AS itab
JOIN sys.indexes AS idx ON itab.object_id = idx.object_id
ORDER BY itab.name, idx.index_id;

D. Zurückgeben der Statistiken interner Tabellen

SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
    ,itab.name AS internal_table_name
    , s.*
FROM sys.internal_tables AS itab
JOIN sys.stats AS s ON itab.object_id = s.object_id
ORDER BY itab.name, s.stats_id;

F. Zurückgeben von Informationen zu Partitionen und Zuordnungseinheiten interner Tabellen

SELECT SCHEMA_NAME(itab.schema_id) AS schema_name
    ,itab.name AS internal_table_name
    ,idx.name AS heap_or_index_name
    ,p.*
    ,au.*
FROM sys.internal_tables AS itab
JOIN sys.indexes AS idx
--     JOIN to the heap or the clustered index
    ON itab.object_id = idx.object_id AND idx.index_id IN (0,1)
JOIN   sys.partitions AS p 
    ON p.object_id = idx.object_id AND p.index_id = idx.index_id
JOIN   sys.allocation_units AS au
--     IN_ROW_DATA (type 1) and ROW_OVERFLOW_DATA (type 3) => JOIN to partition's Hobt
--     else LOB_DATA (type 2) => JOIN to the partition ID itself.
ON au.container_id =  
    CASE au.type 
        WHEN 2 THEN p.partition_id 
        ELSE p.hobt_id 
    END
ORDER BY itab.name, idx.index_id;

G. Zurückgeben der Metadaten interner Tabellen für XML-Indizes

SELECT t.name AS parent_table
    ,t.object_id AS parent_table_id
    ,it.name AS internal_table_name
    ,it.object_id AS internal_table_id
    ,xi.name AS primary_XML_index_name
    ,xi.index_id as primary_XML_index_id
FROM sys.internal_tables AS it
JOIN sys.tables AS t 
    ON it.parent_id = t.object_id
JOIN sys.xml_indexes AS xi 
    ON it.parent_id = xi.object_id
    AND it.parent_minor_id  = xi.index_id
WHERE it.internal_type_desc = 'XML_INDEX_NODES';
GO

H. Zurückgeben der Metadaten interner Tabellen für Service Broker-Warteschlangen

SELECT q.name AS queue_name
    ,q.object_id AS queue_id
    ,it.name AS internal_table_name
    ,it.object_id AS internal_table_id
FROM sys.internal_tables AS it
JOIN sys.service_queues  AS  q ON it.parent_id = q.object_id
WHERE it.internal_type_desc = 'QUEUE_MESSAGES';
GO

I. Zurückgeben der Metadaten interner Tabellen für alle Service Broker-Dienste

SELECT * 
FROM tempdb.sys.internal_tables 
WHERE internal_type_desc = 'SERVICE_BROKER_MAP';
GO

J. Zurückgeben der Metadaten interner Tabellen für Abfragebenachrichtigungsabonnements

SELECT qn.id AS query_subscription_id
    ,it.name AS internal_table_name
    ,it.object_id AS internal_table_id
FROM sys.internal_tables AS it
JOIN sys.dm_qn_subscriptions AS qn ON it.object_id = qn.object_id
WHERE it.internal_type_desc = 'QUERY_NOTIFICATION';

K. Zurückgeben der Metadaten interner Tabellen für Räumlichkeitsindizes

SELECT t.name AS parent_table
    ,t.object_id AS parent_table_id
    ,it.name AS internal_table_name
    ,it.object_id AS internal_table_id
    ,si.name AS spatial_index_name
    ,si.index_id as spatial_index_id
FROM sys.internal_tables AS it
JOIN sys.tables AS t 
    ON it.parent_id = t.object_id
JOIN sys.spatial_indexes AS si 
    ON it.parent_id = si.object_id
    AND it.parent_minor_id  = si.index_id
WHERE it.internal_type_desc = 'EXTENDED_INDEXES';
GO