Interne Tabellen
Neu: 14. April 2006
SQL Server erstellt automatisch interne Tabellen als Unterstützung der folgenden Features:
- Volltextsuche
- Abfragebenachrichtigungen
- Primäre XML-Indizes
- Service Broker
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.
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-Index, die Warteschlange oder den Volltextkatalog) 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.
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.tables-Sicht verknüpfen. Weitere Informationen finden Sie im Beispiel G unten.
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.
Anzeigen der Metadaten in Volltextkatalogen
In der folgenden Abbildung wird die Metadatenstruktur einer internen Tabelle in Volltextkatalogen und -indizes dargestellt. Interne Tabellen werden zum Speichern der Freiliste eines Volltextkatalogs und der Dokumentstruktur eines Volltextindexes verwendet. In der Freiliste werden nicht verwendete Dokument-IDs gespeichert. Eine Dokument-ID ist eine 4 Byte lange ganze Zahl, die intern zur eindeutigen Identifizierung eines Dokuments verwendet wird. In der internen Tabelle der Dokumentstruktur wird eine Zuordnung zwischen einem Volltextschlüssel und einer Dokument-ID gespeichert.
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.
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 und Volltextindizes verwendeten Seiten. Wenn der Name einer Tabelle oder indizierten Sicht angegeben wird, sind die Seiten für die XML-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 Volltextkataloge und Indizes
--
-- Internal table for full-text catalog free list
--
SELECT ftc.name AS fulltext_catalog_name
,ftc.fulltext_catalog_id
,it.name AS internal_table_name
,it.object_id AS internal_table_id
FROM sys.internal_tables AS it
JOIN sys.fulltext_catalogs AS ftc ON it.parent_id = ftc.fulltext_catalog_id
WHERE it.internal_type_desc = 'FULLTEXT_CATALOG_FREELIST' ;
GO
--
-- Internal table for full-text document map
--
SELECT OBJECT_NAME(fti.object_id) AS table_containing_fulltext_index
,it.name AS internal_table_name
,it.object_id AS internal_table_id
FROM sys.internal_tables AS it
JOIN sys.fulltext_indexes AS fti ON it.parent_id = fti.object_id
WHERE it.internal_type_desc = 'FULLTEXT_INDEX_MAP';
GO
K. Zurückgeben der Metadaten interner 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';
Siehe auch
Konzepte
Indizes für Spalten vom xml-Datentyp
Grundlegendes zu Ereignisbenachrichtigungen
Verwenden von Abfragebenachrichtigungen
Andere Ressourcen
Warteschlangen
Architektur der Volltextsuche