Freigeben über


Erstellen von XML-Indizes

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance

In diesem Artikel wird beschrieben, wie primäre und sekundäre XML-Indizes erstellt werden.

Erstellen eines primären XML-Indexes

Um einen primären XML-Index zu erstellen, verwenden Sie die Transact-SQL-DDL-Anweisung CREATE INDEX (Transact-SQL). Nicht alle Optionen, die für Nicht-XML-Indizes verfügbar sind, werden für XML-Indizes unterstützt.

Beachten Sie beim Erstellen eines XML-Indexes Folgendes:

  • Damit ein primärer XML-Index erstellt werden kann, muss die Tabelle, die die zu indizierende XML-Spalte enthält (als Basistabelle bezeichnet), einen gruppierten Index für den Primärschlüssel enthalten. Dieser gruppierte Index stellt sicher, dass der primäre XML-Index mithilfe des gleichen Partitionierungsschemas und der gleichen Partitionierungsfunktion partitioniert werden kann, wenn die Basistabelle partitioniert ist.

  • Wenn ein XML-Index vorhanden ist, kann der gruppierte Primärschlüssel der Tabelle nicht geändert werden. Sie müssen alle XML-Indizes für die Tabelle löschen, bevor Sie den Primärschlüssel ändern können.

  • Ein primärer XML-Index kann für eine einzelne Spalte vom Typ xml erstellt werden. Sie können keinen anderen Indextyp mit der Spalte vom Typ xml als Schlüsselspalte erstellen. Sie können jedoch die Spalte vom Typ xml in einen Nicht-XML-Index einschließen. Jede Spalte vom Typ xml in einer Tabelle kann ihren eigenen primären XML-Index aufweisen. Es ist jedoch nur ein primärer XML-Index pro Spalte vom Typ xml zulässig.

  • XML-Indizes werden im gleichen Namespace wie Nicht-XML-Indizes gespeichert. Aus diesem Grund dürfen ein XML-Index und ein Nicht-XML-Index für die gleiche Tabelle nicht den gleichen Namen besitzen.

  • Die Optionen IGNORE_DUP_KEY- und ONLINE werden für XML-Indizes immer auf OFF festgelegt. Sie können diese Optionen mit einem Wert von OFF angeben.

  • Die Dateigruppen- oder Partitionierungsinformationen der Benutzertabelle werden auf den XML-Index angewendet und können nicht separat angegeben werden.

  • Die DROP_EXISTING-Indexoption kann einen primären XML-Index löschen und einen neuen primären XML-Index erstellen oder einen sekundären XML-Index löschen und einen neuen sekundären XML-Index erstellen. Mit dieser Option kann jedoch nicht ein sekundärer XML-Index gelöscht werden, um einen neuen primären XML-Index zu erstellen oder umgekehrt.

  • Für die Namen primärer XML-Indizes gelten die gleichen Einschränkungen wie für Sichtnamen.

    Sie können keinen XML-Index für eine Spalte vom Typ xml in einer Sicht für eine Tabellen-Wertvariable mit Spalten vom Typ xml oder Variablen vom Typ xml erstellen.

  • Wenn Sie eine Spalte vom Typ xml mithilfe der Option ALTER TABLE ALTER COLUMN aus nicht typisiertem in typisiertes XML oder umgekehrt ändern möchten, sollte kein XML-Index für die Spalte vorhanden sein. Wenn ein XML-Index vorhanden ist, muss dieser gelöscht werden, bevor der Änderungsversuch des Spaltentyps unternommen wird.

  • Die Option ARITHABORT muss auf ON festgelegt werden, wenn ein XML-Index erstellt wird. Zum Abfragen, Einfügen, Löschen oder Aktualisieren von Werten in der XML-Spalte mithilfe der Methoden des xml-Datentyps muss die gleiche Option für die Verbindung festgelegt werden. Wenn dies nicht der Fall ist, schlagen die Methoden des xml-Datentyps fehl.

    Hinweis

    Informationen zu einem XML-Index finden Sie in den Katalogsichten. sp_helpindex wird jedoch nicht unterstützt. Beispiele weiter unten in diesem Abschnitt veranschaulichen, wie die Katalogsichten zum Ermitteln von XML-Indexinformationen abgefragt werden.

Bei Erstellen oder Neuerstellen eines primären XML-Indexes für eine Spalte des xml-Datentyps, die Werte der XML-Schematypen xs:date oder xs:dateTime (oder andere Untertypen dieser Typen) mit einer kleineren Jahresangabe als 1 enthält, kann der Index in SQL Server 2008 (10.0.x) und späteren Versionen nicht erstellt werden. SQL Server 2005 (9.x) erlaubte diese Werte, sodass dieses Problem beim Erstellen von Indizes in einer Datenbank auftreten kann, die in SQL Server 2005 (9.x) generiert wurde. Weitere Informationen finden Sie unter Vergleichen von typisiertem XML mit nicht typisiertem XML.

Beispiel: Erstellen eines primären XML-Indexes

In den meisten Beispielen wird Tabelle T (pk INT PRIMARY KEY, xCol XML) mit einer nicht typisierten XML-Spalte verwendet. Dieses Beispiel kann auf einfache Weise zu typisiertem XML erweitert werden. Aus Gründen der Vereinfachung werden die Abfragen für XML-Dateninstanzen beschrieben, wie das im folgenden Beispiel gezeigt wird:

<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2">
   <title>Writing Secure Code</title>
   <author>
      <first-name>Michael</first-name>
      <last-name>Howard</last-name>
   </author>
   <author>
      <first-name>David</first-name>
      <last-name>LeBlanc</last-name>
   </author>
   <price>39.99</price>
</book>

Die folgende Anweisung erstellt einen XML-Index mit der Bezeichnung idx_xCol für die XML-Spalte xCol der Tabelle T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Erstellen eines sekundären XML-Indexes

Verwenden Sie die Transact-SQL-DDL-Anweisung CREATE INDEX (Transact-SQL), um sekundäre XML-Indizes zu erstellen und den Typ des gewünschten sekundären XML-Indexes anzugeben.

Beachten Sie beim Erstellen sekundärer XML-Indizes Folgendes:

  • Alle Indizierungsoptionen, die für einen nicht gruppierten Index gelten, sind mit Ausnahme von IGNORE_DUP_KEY und ONLINE für sekundäre XML-Indizes zulässig. Die beiden Optionen müssen für sekundäre XML-Indizes immer auf OFF festgelegt sein.

  • Die sekundären Indizes werden ebenso wie der primäre XML-Index partitioniert.

  • DROP_EXISTING kann einen sekundären Index für die Benutzertabelle löschen und einen anderen sekundären Index für die Benutzertabelle erstellen.

Sie können die sys.xml_indexes -Katalogsicht abfragen, um XML-Indexinformationen abzurufen. Die secondary_type_desc-Spalte in der sys.xml_indexes-Katalogsicht stellt den Typ des sekundären Indexes bereit:

SELECT  *
FROM    sys.xml_indexes;

Der zurückgegebene Wert in der secondary_type_desc-Spalte kann NULL, PATH, VALUE oder PROPERTY sein. Für den primären Index lautet der zurückgegebene Wert NULL.

Beispiel: Erstellen sekundärer XML-Indizes

Das folgende Beispiel zeigt, wie sekundäre XML-Indizes erstellt werden. Im Beispiel werden außerdem Informationen zu den von Ihnen erstellten XML-Indizes bereitgestellt.

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML);
GO
-- Create primary index.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol
ON T(XmlCol);
GO
-- Create secondary indexes (PATH, VALUE, PROPERTY).
CREATE XML INDEX PIdx_T_XmlCol_PATH ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PATH;
GO
CREATE XML INDEX PIdx_T_XmlCol_VALUE ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR VALUE;
GO
CREATE XML INDEX PIdx_T_XmlCol_PROPERTY ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PROPERTY;
GO

Sie können die sys.xml_indexes-Katalogsicht abfragen, um XML-Indexinformationen abzurufen. Der Typ wird in der secondary_type_desc -Spalte des zweiten Indizes bereitgestellt.

SELECT  *
FROM    sys.xml_indexes;

Sie können auch die Katalogsicht nach Indexinformationen abfragen.

SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T');

Sie können Beispieldaten hinzufügen und anschließend die XML-Indexinformationen überprüfen.

INSERT INTO T VALUES (1,
'<doc id="123">
<sections>
<section num="2">
<heading>Background</heading>
</section>
<section num="3">
<heading>Sort</heading>
</section>
<section num="4">
<heading>Search</heading>
</section>
</sections>
</doc>');
GO
-- Check XML index information.
SELECT *
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, NULL, 'DETAILED');
GO
-- Space usage of primary XML index
DECLARE @index_id int;
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i
WHERE   i.name = 'PIdx_T_XmlCol' and object_name(i.object_id) = 'T';

SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO
--- Space usage of secondary XML index (for example PATH secondary index)  PIdx_T_XmlCol_PATH
DECLARE @index_id int;
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i
WHERE  i.name = 'PIdx_T_XmlCol_PATH' and object_name(i.object_id) = 'T';

SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO

-- Space usage of all secondary XML indexes for a particular table
SELECT i.name, object_name(i.object_id), stats.*
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, DEFAULT, 'DETAILED') stats
JOIN sys.xml_indexes i ON (stats.object_id = i.object_id and stats.index_id = i.index_id)
WHERE secondary_type is not null;
-- Drop secondary indexes.
DROP INDEX PIdx_T_XmlCol_PATH ON T;
GO
DROP INDEX PIdx_T_XmlCol_VALUE ON T;
GO
DROP INDEX PIdx_T_XmlCol_PROPERTY ON T;
GO
-- Drop primary index.
DROP INDEX PIdx_T_XmlCol ON T;
-- Drop table T.
DROP TABLE T;
GO

Siehe auch