Erstellen von XML-Indizes

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

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

Erstellen eines primären XML-Indexes

Verwenden Sie zum Erstellen eines primären XML-Indexes die CREATE INDEX (Transact-SQL)Transact-SQL DDL-Anweisung. Nicht alle Optionen, die für Nicht-XML-Indizes verfügbar sind, werden für XML-Indizes unterstützt.

Beachten Sie Folgendes beim Erstellen eines XML-Indexes:

  • 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 desselben Partitionierungsschemas und derselben Partitionierungsfunktion partitioniert werden kann, wenn die Basistabelle partitioniert wird.

  • Wenn ein XML-Index vorhanden ist, kann der gruppierte Primärschlüssel der Tabelle nicht geändert werden. Sie müssen alle XML-Indizes in der Tabelle ablegen, bevor Sie den Primärschlüssel ändern.

  • Ein primärer XML-Index kann für eine einzelne Spalte vom Typ xml erstellt werden. Sie können keinen anderen Indextyp mit der XML-Typspalte als Schlüsselspalte erstellen. Sie können jedoch die XML-Typspalte 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. Daher können Sie keinen XML-Index und keinen Nicht-XML-Index in derselben Tabelle mit demselben Namen haben.

  • 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. Diese Option kann jedoch keinen sekundären XML-Index ablegen, 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 XML-Typspalte in einer Ansicht, für eine Tabellenvariable mit Xml-Typspalten oder XML-Typvariablen 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 von XML-Datentypmethoden muss dieselbe Option für die Verbindung festgelegt werden. Ist dies nicht der Fehler, schlagen die XML-Datentypmethoden 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.

Wenn Sie einen primären XML-Index für eine XML-Datentypspalte erstellen oder neu erstellen, die Werte der XML-Schematypen xs:date oder xs:dateTime (oder untertypen dieser Typen) enthält, die ein Jahr kleiner als 1 aufweisen, schlägt die Indexerstellung in SQL Server 2008 (10.0.x) und höheren Versionen fehl. 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

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

<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, der für die XML-Spalte xCol der Tabelle Taufgerufen wirdidx_xCol:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)

Erstellen eines sekundären XML-Indexes

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

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

  • 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 Katalogansicht stellt den Typ des sekundären Indexes bereit:

SELECT  *
FROM    sys.xml_indexes;

Die in der secondary_type_desc Spalte zurückgegebenen Werte können 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 Katalogansicht abfragen, um XML-Indizes 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