Freigeben über


Selektive XML-Indizes (SXI)

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

Selektive XML-Indizes sind ein weiterer Typ von XML-Index, der Ihnen zusätzlich zu den herkömmlichen XML-Indizes zur Verfügung steht. Die Ziele der selektiven XML-Indexfunktion sind Folgende:

  • Verbessern der Leistung von Abfragen zu XML-Daten, die in SQL Server gespeichert sind.

  • Unterstützen einer schnelleren Indizierung großer XML-Datenlasten.

  • Verbessern der Skalierbarkeit durch das Reduzieren der Speicherkosten für XML-Indizes.

Die Haupteinschränkung bei herkömmlichen XML-Indizes liegt darin, dass sie das gesamte XML-Dokument indizieren. Dies führt zu mehreren bedeutenden Nachteilen, z. B. verringerter Abfrageleistung und höheren Kosten für die Indexwartung, die sich in der Regel auf die Indexspeicherkosten beziehen.

Mit der selektiven XML-Indexfunktion können Sie nur bestimmte Pfade aus den XML-Dokumenten zum Index höherstufen. Bei der Indexerstellung werden diese Pfade ausgewertet, und die Knoten, auf die sie verweisen, werden aufgeteilt und in einer relationalen Tabelle in SQL Server gespeichert. Diese Funktion verwendet einen effizienten Zuordnungsalgorithmus, der in Zusammenarbeit mit dem SQL Server-Produktteam von Microsoft Research entwickelt wurde. Dieser Algorithmus ordnet die XML-Knoten einer einzelnen relationalen Tabelle zu und erzielt eine herausragende Leistung bei sehr geringem Speicherbedarf.

Die selektive XML-Indexfunktion unterstützt auch sekundäre selektive XML-Indizes für Knoten, die von einem selektiven XML-Index indiziert wurden. Diese sekundären selektiven Indizes sind effizient und verbessern die Leistung von Abfragen noch weiter.

Vorteile selektiver XML-Indizes

Selektive XML-Indizes bieten die folgenden Vorteile:

  1. Deutlich verbesserte Abfrageleistung für den XML-Datentyp bei typische Abfragelasten.

  2. Im Vergleich zu herkömmlichen XML-Indizes reduzierte Speicheranforderungen.

  3. Im Vergleich zu herkömmlichen XML-Indizes reduzierte Indexwartungskosten.

  4. Anwendungen müssen nicht aktualisiert werden, um die Vorteile selektiver XML-Indizes nutzen zu können.

Selektive XML-Indizes und primäre XML-Indizes

Wichtig

Im Hinblick auf eine bessere Leistung und einen effizienteren Speicher erstellen Sie in den meisten Fällen einen selektiven XML-Index anstatt eines gewöhnlichen XML-Indexes.

Ein selektiver XML-Index wird jedoch nicht empfohlen, wenn eine der beiden folgenden Bedingungen zutrifft:

  • Sie ordnen eine große Anzahl von Knotenpfaden zu.

  • Sie unterstützen Abfragen für unbekannte Elemente oder Elemente in einer unbekannten Position in der Dokumentstruktur.

Beispiel für einen selektiven XML-Index

Betrachten Sie das folgende XML-Fragment, das ein XML-Dokument in einer Tabelle mit ungefähr 500.000 Zeilen darstellt:

<book>
    <created>2004-03-01</created>
    <authors>Various</authors>
    <subjects>
        <subject>English wit and humor -- Periodicals</subject>
        <subject>AP</subject>
    </subjects>
    <title>Punch, or the London Charivari, Volume 156, April 2, 1919</title>
    <id>etext11617</id>
</book>

Die Erstellung eines primären XML-Index über so viele Zeilen dieses einfachen Schemas hinweg dauert sehr lange. Die Abfrage dieser Daten wird zusätzlich noch dadurch erschwert, dass ein primärer XML-Index keine selektive Indizierung unterstützt.

Wenn Sie diese Daten nur über den /book/title -Pfad und den /book/subjects -Pfad abfragen müssen, können Sie den folgenden selektiven XML-Index erstellen:

CREATE SELECTIVE XML INDEX SXI_index
ON Tbl(xmlcol)
FOR
(
    pathTitle = '/book/title/text()' AS XQUERY 'xs:string',
    pathAuthors = '/book/authors' AS XQUERY 'node()',
    pathId = '/book/id' AS SQL NVARCHAR(100)
);

Die vorangehende Anweisung ist ein gutes Beispiel für die CREATE-Syntax, die Sie zum Erstellen eines selektiven XML-Index verwenden. Sie geben in der CREATE-Anweisung zuerst einen Namen für den Index an und identifizieren die Tabelle und die XML-Spalte, die Sie indizieren möchten. Anschließend stellen Sie die zu indizierende Pfade bereit. Ein Pfad besteht aus drei Teilen:

  1. Einem Namen, der den Pfad eindeutig angibt.

  2. Einem XQuery-Ausdruck, der den Pfad beschreibt.

  3. Optionalen Optimierungshinweise.

Weitere Informationen zu diesen Elementen finden Sie unter Verwandte Aufgaben.

Unterstützte Funktionen, Voraussetzungen und Einschränkungen

Unterstützte XML-Funktionen

Selektive XML-Indizes unterstützen die XQuery, die von SQL Server in den exist()-, value()- und nodes()-Methoden unterstützt werden.

  • Für die exist()-, value()- und nodes()-Methoden enthalten selektive XML-Indizes ausreichende Informationen, um den gesamten Ausdruck zu transformieren.

  • Für die query()- und modify()-Methoden können selektive XML-Indizes möglicherweise nur zum Filtern von Knoten verwendet werden.

  • Für die query()-Methode werden selektive XML-Indizes nicht zum Abrufen von Ergebnissen verwendet.

  • Für die modify()-Methode werden selektive XML-Indizes nicht zum Aktualisieren von XML-Dokumenten verwendet.

Nicht unterstützte XML-Funktionen

Selektive XML-Indizes unterstützen nicht die folgenden Funktionen, die in der SQL Server-Implementierung von XML unterstützt werden:

  • Indizieren von Knoten mit komplexen XS-Typen: Union-Typen, Sequenztypen, und Listtypen.

  • Indizieren von Knoten mit binären XS-Typen: z. B. base64Binary und hexBinary.

  • Angeben von Knoten, die mit XPath-Ausdrücken indiziert werden sollen und am Ende das Platzhalterzeichen * aufweisen: z. B. /a/b/c/*, /a//b/*oder /a/b/*:c.

  • Indizieren einer anderen Achse als untergeordnetes Element, Attribut oder Nachfolger. Der //<step> -Fall ist als spezieller Fall zulässig.

  • Indizieren von XML-Verarbeitungsanweisungen und -Kommentaren.

  • Angeben und Abrufen des Bezeichners für einen Knoten mit der id()-Funktion.

Voraussetzungen

Die folgenden Voraussetzungen müssen erfüllt sein, bevor Sie einen selektiven XML-Index für eine XML-Spalte in einer Benutzertabelle erstellen können:

  • Für den Primärschlüssel der Benutzertabelle muss ein gruppierter Index vorhanden sein.

  • Der Primärschlüssel der Benutzertabelle ist auf eine Größe von 128 Byte beschränkt, wenn er zusammen mit selektiven XML-Indizes verwendet wird.

  • Der Gruppierungsschlüssel der Benutzertabelle ist auf 15 Spalten beschränkt, wenn er zusammen mit selektiven XML-Indizes verwendet wird.

Begrenzungen

Allgemeine Anforderungen und Einschränkungen

  • Jeder selektive XML-Index kann nur für eine einzige XML-Spalte erstellt werden.
  • Für eine Spalte, die keine XML-Spalte ist, kann kein selektiver XML-Index erstellt werden.
  • Jede XML-Spalte in einer Tabelle kann nur über einen selektiven XML-Index verfügen.
  • Jede Tabelle kann bis zu 249 selektive XML-Indizes enthalten.

Einschränkungen für unterstützte Objekte

Für die folgenden Objekte können keine selektiven XML-Indizes erstellt werden:

  • XML-Spalten in einer Sicht
  • Tabellenwertvariable mit XML-Spalten
  • XML-Typvariablen
  • Berechnete XML-Spalten
  • XML-Spalten mit einer Tiefe von mehr als 128 geschachtelten Knoten.

Speichereinschränkungen

Die Anzahl der Knoten aus dem XML-Dokument, die dem Index hinzugefügt werden können, ist beschränkt. Ein selektiver XML-Index ordnet XML-Dokumente einer einzelnen relationalen Tabelle zu. Daher kann er nicht mehr als 1024 Spalten mit Nicht-NULL-Werten in den Spalten der Tabelle aufweisen. Weiterhin gelten viele der Einschränkungen von Sparsespalten auch für selektive XML-Indizes, da die Indizes Sparsespalten zum Speichern verwenden.

Die maximale Anzahl von Nicht-NULL-Spalten, die in einer Zeile unterstützt werden, hängt von der Größe der Daten in den Spalten ab:

  • Im besten Fall werden 1024 Nicht-NULL-Spalten unterstützt, wenn alle Spalten den Typ bithaben.

  • Im schlimmsten Fall werden nur 236 Nicht-NULL-Spalten unterstützt, wenn alle Spalten große Objekte des Typs varcharsind.

Selektive XML-Indizes verwenden intern ein bis vier Spalten für jeden Knotenpfad, der indiziert wird. Die Gesamtzahl der Knoten, die indizierte werden können, reicht von 60 bis zu mehreren hundert Knoten, abhängig von der tatsächlichen Größe der Daten in den indizierten Pfaden.

  • Im schlimmsten Fall, wenn einige oder alle Knoten in der Knotenpfaddefinition mit // zugeordnet sind, beträgt die maximale Anzahl indizierter Knoten 60.

  • Im besten Fall, wenn Knoten ohne // in der Knotenpfaddefinition zugeordnet werden, beträgt die maximale Anzahl indizierter Knoten 200.

Selektive XML-Indizes werden neu erstellt, wenn Sie CREATE oder ALTER für den Index ausführen.

Wenn Sie einen selektiven XML-Index erstellen (CREATE) oder ändern (ALTER), wird er im Singlethread-Offlinemodus neu erstellt. Die häufige Verwendung von ALTER-Anweisungen wirkt sich negativ auf die Leistung von Abfragen für die XML-Dokumente aus.

Weitere Einschränkungen

  • Selektive XML-Indizes werden nicht in Abfragehinweisen unterstützt.

  • Selektive XML-Indizes und sekundäre selektive XML-Indizes werden nicht vom Datenbankoptimierungsratgeber unterstützt.

Siehe auch