Selektive XML-Indizes (SXI)

Gilt für:SQL ServerAzure SQL-DatenbankAzure 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:

  • Zur Verbesserung der Leistung von Abfragen über 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. Zum Zeitpunkt der Indexerstellung werden diese Pfade ausgewertet, und die Knoten, auf die sie verweisen, werden in einer relationalen Tabelle in SQL Server zerkleinert und gespeichert. Dieses Feature verwendet einen effizienten Zuordnungsalgorithmus, der von Microsoft Research in Zusammenarbeit mit dem SQL Server-Produktteam 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 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 leidet auch daran, dass ein primärer XML-Index die selektive Indizierung nicht 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-Features

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()Methoden value() und nodes() Methoden enthalten selektive XML-Indizes genügend Informationen, um den gesamten Ausdruck zu transformieren.

  • Für die query() Und modify() Methoden können selektive XML-Indizes nur für die Knotenfilterung 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-Features

Selektive XML-Indizes unterstützen nicht die folgenden Features, 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 in einer einzelnen XML-Spalte erstellt werden.
  • Sie können keinen selektiven XML-Index für eine Nicht-XML-Spalte erstellen.
  • Jede XML-Spalte in einer Tabelle kann nur einen selektiven XML-Index aufweisen.
  • Jede Tabelle kann bis zu 249 selektive XML-Indizes enthalten.

Einschränkungen für unterstützte Objekte

Sie können keine selektiven XML-Indizes für die folgenden Objekte erstellen:

  • XML-Spalten in einer Ansicht
  • Variable mit Tabellenwert mit XML-Spalten
  • XML-Typvariablen
  • Berechnete XML-Spalten
  • XML-Spalten mit einer Tiefe von mehr als 128 geschachtelten Knoten.

Speichereinschränkungen

Es gibt ein endliches Limit für die Anzahl der Knoten aus dem XML-Dokument, die dem Index hinzugefügt werden können. Ein selektiver XML-Index ordnet XML-Dokumente einer einzelnen relationalen Tabelle zu. Daher darf es nicht mehr als 1024 Nicht-Null-Spalten in einer bestimmten Zeile der Tabelle enthalten. 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 den Index ERSTELLEN oder ÄNDERN

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 in Abfragehinweisen nicht unterstützt.

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

Siehe auch