Angeben von Pfaden und Optimierungshinweisen für selektive XML-Indizes

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

In diesem Artikel wird beschrieben, wie Knotenpfade zum Indizieren und Optimierungshinweise für die Indizierung angegeben werden, wenn Sie selektive XML-Indizes erstellen oder ändern.

Sie geben Knotenpfade und Optimierungshinweise gleichzeitig in einer der folgenden Anweisungen an:

Weitere Informationen zu selektiven XML-Indizes finden Sie unter Selektive XML-Indizes (SXI).

Grundlegendes zu XQuery- und SQL Server-Typen in nicht typisiertem XML

Selektive XML-Indizes unterstützen zwei Typensysteme: XQuery-Typen und SQL Server-Typen. Der indizierte Pfad kann entweder verwendet werden, um einem XQuery-Ausdruck zu entsprechen, oder um dem Rückgabetyp der value() Methode des XML-Datentyps zu entsprechen.

  • Wenn ein Pfad zum Index nicht kommentiert oder mit dem XQUERY-Schlüsselwort kommentiert wird, entspricht der Pfad einem XQuery-Ausdruck. Es gibt zwei Varianten von XQUERY-kommentierten Knotenpfaden:

    • Wenn Sie das XQUERY-Schlüsselwort und den XQuery-Datentyp nicht angeben, werden Standardzuordnungen verwendet. In der Regel sind Leistung und Speicher nicht optimal.

    • Wenn Sie das XQUERY-Schlüsselwort und den XQuery-Datentyp sowie optional andere Optimierungshinweise angeben, können Sie die bestmögliche Leistung und den effizientesten möglichen Speicher erzielen. Eine Umwandlung kann jedoch fehlschlagen.

  • Wenn ein Pfad zum Index mit dem SQL-Schlüsselwort kommentiert wird, entspricht der Pfad dem Rückgabetyp der value() Methode des XML-Datentyps . Geben Sie den entsprechenden SQL Server-Datentyp an, bei dem es sich um den Rückgabetyp handelt, den Sie von der value() Methode erwarten.

Es gibt subtile Unterschiede zwischen dem XQuery-Ausdrucks-XML-Typsystem und dem SQL Server-Typsystem, das auf die value() Methode des XML-Datentyps angewendet wird. Zu diesen Unterschieden gehören unter anderem:

  • Das XQuery-Typsystem beachtet Leerzeichen. Laut XQuery-Typsemantik sind beispielsweise die Zeichenfolgen "abc" und "abc" nicht gleich, während in SQL Server diese Zeichenfolgen gleich sind.

  • XQuery-Gleitkommadatentypen unterstützen die speziellen Werte von +/- 0 (null) und +/- Unendlichkeit. Diese speziellen Werte werden in den SQL Server-Gleitkomma-Datentypen nicht unterstützt.

XQuery-Typen in nicht typisiertem XML

  • XQuery-Typen entsprechen XQuery-Ausdrücken in allen Methoden des XML-Datentyps , einschließlich der value() Methode.

  • XQuery-Typen unterstützen diese Optimierungshinweise: node(), SINGLETON, DATA TYPE und MAXLENGTH.

Für XQuery-Ausdrücke über nicht typisiertem XML können Sie zwischen zwei Vorgangsmodi auswählen:

  • Standardmäßiger Zuordnungsmodus. In diesem Modus geben Sie nur den Pfad an, wenn Sie einen selektiven XML-Index erstellen.

  • Vom Benutzer angegebener Zuordnungsmodus. In diesem Modus geben Sie sowohl den Pfad als auch optionale Optimierungshinweise an.

Der Standardzuordnungsmodus verwendet eine konservative Speicheroption, die immer sicher und allgemein ist. Sie kann jedem Ausdruckstyp entsprechen. Eine Einschränkung des Standardzuordnungsmodus ist weniger als die optimale Leistung, da eine höhere Anzahl von Laufzeit casts erforderlich ist und sekundäre Indizes nicht verfügbar sind.

Hier ist ein Beispiel für einen selektiven XML-Index, der mit Standardzuordnungen erstellt wurde. Für alle drei Pfade werden der Standardknotentyp (xs:untypedAtomic) und Kardinalität verwendet.

CREATE SELECTIVE XML INDEX example_sxi_UX_default
ON Tbl(xmlcol)
FOR
(
    mypath01 =  '/a/b',
    mypath02 = '/a/b/c',
    mypath03 = '/a/b/d'
);

Mit dem vom Benutzer angegebene Zuordnungsmodus können Sie einen Typen und die Kardinalität für den Knoten angeben, um eine bessere Leistung zu erzielen. Diese verbesserte Leistung wird jedoch nur durch Verzicht auf Sicherheit (da eine Umwandlung fehlschlagen kann) und durch Verzicht auf Allgemeinheit (da nur der angegebene Typ mit dem selektiven XML-Index verglichen wird) erreicht.

Die für nicht typisiertes XML unterstützten XQuery-Typen sind:

  • xs:boolean
  • xs:double
  • xs:string
  • xs:date
  • xs:time
  • xs:dateTime

Wenn der Typ nicht angegeben ist, wird der Knoten als xs:untypedAtomic Datentyp angenommen.

Sie können den selektiven XML-Index wie nachfolgend aufgeführt optimieren:

CREATE SELECTIVE XML INDEX example_sxi_UX_optimized
ON Tbl(xmlcol)
FOR
(
    mypath= '/a/b' as XQUERY 'node()',
    pathX = '/a/b/c' as XQUERY 'xs:double' SINGLETON,
    pathY = '/a/b/d' as XQUERY 'xs:string' MAXLENGTH(200) SINGLETON
);
-- mypath - Only the node value is needed; storage is saved.
-- pathX - Performance is improved; secondary indexes are possible.
-- pathY - Performance is improved; secondary indexes are possible; storage is saved.

SQL Server-Typen in nicht typisiertem XML

  • SQL Server-Typen entsprechen dem Rückgabewert der value() Methode.

  • SQL Server-Typen unterstützen diesen Optimierungshinweis: SINGLETON.

Die Angabe eines Typs ist für Pfade erforderlich, die SQL Server-Typen zurückgeben. Verwenden Sie denselben SQL Server-Typ, den Sie in der value() Methode verwenden würden.

Betrachten Sie die folgende Abfrage:

SELECT T.record,
    T.xmldata.value('(/a/b/d)[1]', 'NVARCHAR(200)')
FROM myXMLTable T;

Die angegebene Abfrage gibt einen Wert des Pfads /a/b/d zurück, der in einen NVARCHAR(200)-Datentyp gepackt ist, sodass der für den Knoten anzugebende Datentyp offensichtlich ist. Es gibt jedoch kein Schema, um die Kardinalität des Knotens in nicht typisiertem XML anzugeben. Um diesen Knoten anzugeben ( d tritt höchstens einmal unter dem übergeordneten Knoten bauf), erstellen Sie einen selektiven XML-Index, der den Optimierungshinweis SINGLETON wie folgt verwendet:

CREATE SELECTIVE XML INDEX example_sxi_US
ON Tbl(xmlcol)
FOR
(
    node1223 = '/a/b/d' as SQL NVARCHAR(200) SINGLETON
);

Grundlegendes zur selektiven XML-Indexunterstützung für typierte XML

Typiertes XML in SQL Server ist ein Schema, das einem bestimmten XML-Dokument zugeordnet ist. Das Schema definiert die Gesamtdokumentstruktur und Typen von Knoten. Wenn ein Schema vorhanden ist, wendet der selektive XML-Index die Schemastruktur an, wenn der Benutzer Pfade höher stuft. Daher müssen die XQUERY-Typen für Pfade nicht angegeben werden.

Ein selektiver XML-Index unterstützt die folgenden XSD-Typen:

  • xs:anyUri
  • xs:boolean
  • xs:date
  • xs:dateTime
  • xs:day
  • xs:decimal
  • xs:double
  • xs:float
  • xs:int
  • xs:integer
  • xs:language
  • xs:long
  • xs:name
  • xs:NCName
  • xs:negativeInteger
  • xs:nmtoken
  • xs:nonNegativeInteger
  • xs:nonPositiveInteger
  • xs:positiveInteger
  • xs:qname
  • xs:short
  • xs:string
  • xs:time
  • xs:token
  • xs:unsignedByte
  • xs:unsignedInt
  • xs:unsignedLong
  • xs:unsignedShort

Wenn ein selektiver XML-Index über einem Dokument erstellt wird, dem ein Schema zugeordnet ist, gibt die Angabe eines XQuery-Typs bei der Indexerstellung oder Änderung einen Fehler zurück. Der Benutzer kann SQL-Typanmerkungen bei der Pfadheraufstufung verwenden. Der SQL-Typ muss eine gültige Konvertierung des XSD-Typs sein, der im Schema definiert ist, oder es wird ein Fehler ausgelöst. Es werden alle SQL-Typen unterstützt, die in XSD über eine entsprechende Darstellung verfügen, mit Ausnahme der Typen für Datum/Uhrzeit.

Hinweis

Der selektive Index wird verwendet, wenn der typ, der in der Heraufwertung des selektiven XML-Indexpfads angegeben ist, mit dem Rückgabewert der value() Methode identisch ist.

Die folgenden Optimierungshinweise können mit typisierten XML-Dokumenten verwendet werden:

  • node() Optimierungshinweis.

  • Der MAXLENGTH-Optimierungshinweis kann mit xs:string-Typen verwendet werden, um den indizierten Wert zu kürzen.

Weitere Informationen zu Optimierungshinweisen finden Sie unter Angeben von Optimierungshinweisen.

Angeben von Pfaden

Mit einem selektiven XML-Index können Sie nur eine Teilmenge der Knoten aus den gespeicherten XML-Daten, die für die voraussichtlich durchgeführten Abfragen relevant sind, indizieren. Wenn die Teilmenge der relevanten Knoten viel kleiner als die Gesamtzahl der Knoten im XML-Dokument ist, speichert der selektive XML-Index nur die relevanten Knoten. Um von einem selektiven XML-Index profitieren zu können, identifizieren Sie die richtige Teilmenge der Knoten für die Indizierung.

Auswählen der zu indizierenden Knoten

Sie können die folgenden beiden Prinzipien verwenden, um die richtige Teilmenge von Knoten zu identifizieren, die einem selektiven XML-Index hinzugefügt werden sollen.

  1. Prinzip 1: Indizieren Sie alle Knoten, die Sie untersuchen müssen, um einen bestimmten XQuery-Ausdruck auszuwerten.

    • Indizieren Sie alle Knoten, deren Vorhandensein oder Wert im XQuery-Ausdruck verwendet wird.

    • Indizieren Sie alle Knoten im XQuery-Ausdruck, auf den XQuery-Prädikate angewendet werden.

    Betrachten Sie die folgende Abfrage über das XML-Beispieldokument in diesem Artikel:

    SELECT T.record FROM myXMLTable T
    WHERE T.xmldata.exist('/a/b[./c = "43"]') = 1;
    

    Um die XML-Instanzen zurückzugeben, die diese Abfrage erfüllen, muss ein selektiver XML-Index zwei Knoten in jeder XML-Instanz untersuchen:

    • Knoten c, da sein Wert im XQuery-Ausdruck verwendet wird.

    • Knoten b, da ein Prädikat auf den Knotenb im XQuery-Ausdruck angewendet wird.

  2. Prinzip 2: Um eine optimale Leistung zu erzielen, indizieren Sie alle Knoten, die für die Auswertung eines bestimmten XQuery-Ausdrucks erforderlich sind. Wenn Sie nur einige der Knoten indizieren, verbessert der selektive XML-Index die Auswertung von Unterausdrücke, die nur indizierte Knoten enthalten.

Um die Leistung der oben aufgeführten SELECT-Anweisung zu verbessern, können Sie den folgenden selektiven XML-Index erstellen:

CREATE SELECTIVE XML INDEX simple_sxi
ON Tbl(xmlcol)
FOR
(
    path123 =  '/a/b',
    path124 =  '/a/b/c'
);

Identische Pfade indiziert

Identische Pfade können nicht mit demselben Datentyp unter unterschiedlichen Pfadnamen heraufstufen. Die folgende Abfrage löst z. B. einen Fehler aus, da pathOne und pathTwo identisch sind:

CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
    pathOne = 'book/authors/authorID' AS XQUERY 'xs:string',
    pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);

Sie können jedoch identische Pfade als andere Datentypen mit anderen Namen höher stufen. So ist die folgende Abfrage beispielsweise jetzt akzeptabel, da die Datentypen verschieden sind:

CREATE SELECTIVE INDEX test_simple_sxi ON T1(xmlCol)
FOR
(
    pathOne = 'book/authors/authorID' AS XQUERY 'xs:double',
    pathTwo = 'book/authors/authorID' AS XQUERY 'xs:string'
);

Beispiele

Hier sind einige weitere Beispiele für die Auswahl der richtigen Knoten, die für verschiedene XQuery-Typen indiziert werden sollen.

Beispiel 1

Hier ist eine einfache XQuery, die die exist() Methode verwendet:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e/h') = 1;

In der folgenden Tabelle sind die Knoten aufgeführt, die indiziert werden müssen, damit diese Abfrage den selektiven XML-Index verwendet.

In den Index einzuschließender Knoten Grund zum Indizieren dieses Knotens
/a/b/c/d/e/h Das Vorhandensein eines Knotens h wird in der exist() Methode ausgewertet.

Beispiel 2

Dies ist eine komplexere Variation der vorherigen XQuery mit angewendetem Prädikat:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b/c/d/e[./f = "SQL"]') = 1;

In der folgenden Tabelle sind die Knoten aufgeführt, die indiziert werden müssen, damit diese Abfrage den selektiven XML-Index verwendet.

In den Index einzuschließender Knoten Grund zum Indizieren dieses Knotens
/a/b/c/d/e Ein Prädikat wird auf den Knoten eangewendet.
/a/b/c/d/e/f Der Wert des Knotens f wird innerhalb des Prädikats ausgewertet.

Beispiel 3

Hier ist eine komplexere Abfrage mit einer value() Klausel:

SELECT T.record,
    T.xmldata.value('(/a/b/c/d/e[./f = "SQL"]/g)[1]', 'nvarchar(100)')
FROM myXMLTable T;

In der folgenden Tabelle sind die Knoten aufgeführt, die indiziert werden müssen, damit diese Abfrage den selektiven XML-Index verwendet.

In den Index einzuschließender Knoten Grund zum Indizieren dieses Knotens
/a/b/c/d/e Ein Prädikat wird auf den Knoten eangewendet.
/a/b/c/d/e/f Der Wert des Knotens f wird innerhalb des Prädikats ausgewertet.
/a/b/c/d/e/g Der Wert des Knotens g wird von der value() Methode zurückgegeben.

Beispiel 4

Hier ist eine Abfrage, die eine FLWOR-Klausel innerhalb einer exist() Klausel verwendet. (Der Name "FLWOR" leitet sich von den fünf Klauseln ab, aus denen sich ein FLWOR-Ausdruck von XQuery zusammensetzen kann: for, let, where, order by und return.)

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('
  For $x in /a/b/c/d/e
  Where $x/f = "SQL"
  Return $x/g
') = 1;

In der folgenden Tabelle sind die Knoten aufgeführt, die indiziert werden müssen, damit diese Abfrage den selektiven XML-Index verwendet.

In den Index einzuschließender Knoten Grund zum Indizieren dieses Knotens
/a/b/c/d/e Das Vorhandensein des Knotens e wird in der FLWOR-Klausel ausgewertet.
/a/b/c/d/e/f Der Wert des Knotens f wird in der FLWOR-Klausel ausgewertet.
/a/b/c/d/e/g Das Vorhandensein eines Knotens g wird von der exist() Methode ausgewertet.

Angeben von Optimierungshinweisen

Sie können optionale Optimierungshinweise verwenden, um zusätzliche Mappingdetails für einen Knoten anzugeben, der von einem selektiven XML-Index indiziert wird. Sie können z. B. den Datentyp und die Kardinalität des Knotens sowie bestimmte Informationen zur Struktur der Daten angeben. Diese zusätzlichen Informationen unterstützen eine bessere Zuordnung. Sie ermöglichen darüber hinaus eine Verbesserungen der Leistung und Speichereinsparungen oder sogar beides.

Die Verwendung von Optimierungshinweisen ist optional. Sie können stets die Standardzuordnungen übernehmen, die zuverlässig sind, möglicherweise jedoch keine optimale Leistung und Speicher bereitstellen.

Einige Optimierungshinweise, z. B. der SINGLETON-Hinweis, führen Einschränkungen für Ihre Daten ein. In einigen Fällen können Fehler ausgelöst werden, wenn diese Einschränkungen nicht erfüllt sind.

Vorteile von Optimierungshinweisen

In der folgenden Tabelle sind die Optimierungshinweise aufgeführt, die einen effizienteren Speicher oder eine verbesserte Leistung ermöglichen.

Optimierungshinweis Effizienterer Speicher Verbesserte Leistung
node() Ja Nein
SINGLETON Nein Ja
DATA TYPE Ja Ja
MAXLENGTH Ja Ja

Optimierungshinweise und Datentypen

Sie können Knoten als XQuery-Datentypen oder als SQL Server-Datentypen indiziert werden. In der folgenden Tabelle ist aufgeführt, welche Optimierungshinweise für die einzelnen Datentypen unterstützt werden.

Optimierungshinweis XQuery-Datentypen SQL-Datentypen
node() Ja Nein
SINGLETON Ja Ja
DATA TYPE Ja Nein
MAXLENGTH Ja Nein

node()-Optimierungshinweis

Gilt für: XQuery-Datentypen

Mit der node() Optimierung können Sie einen Knoten angeben, dessen Wert nicht zum Auswerten der typischen Abfrage erforderlich ist. Dieser Hinweis reduziert Speicheranforderungen, wenn die typische Abfrage nur das Vorhandensein des Knotens auswerten muss. (Standardmäßig speichert ein selektiver XML-Index den Wert für alle höher gestuften Knoten, außer komplexen Knotentypen.)

Betrachten Sie das folgenden Beispiel:

SELECT T.record FROM myXMLTable T
WHERE T.xmldata.exist('/a/b[./c=5]') = 1;

Um einen selektiven XML-Index zum Auswerten dieser Abfrage zu verwenden, stufen Sie die Knoten b und chöher. Da der Wert des Knotens b jedoch nicht erforderlich ist, können Sie den node() Hinweis mit der folgenden Syntax verwenden:

`/a/b/ as node()

Wenn eine Abfrage den Wert eines Knotens erfordert, der mit dem node() Hinweis indiziert wurde, kann der selektive XML-Index nicht verwendet werden.

SINGLETON-Optimierungshinweis

Gilt für: XQuery- oder SQL Server-Datentypen

Der SINGLETON-Optimierungshinweis gibt die Kardinalität eines Knotens an. Dieser Hinweis verbessert die Abfrageleistung, da im Voraus bekannt ist, dass ein Knoten höchstens einmal innerhalb des übergeordneten oder übergeordneten Elements angezeigt wird.

Betrachten Sie das XML-Beispieldokument in diesem Artikel.

Um einen selektiven XML-Index zum Abfragen dieses Dokuments zu verwenden, können Sie den SINGLETON-Hinweis für den Knoten d angeben, da er höchstens einmal in seinem übergeordneten Element vorkommt.

Wenn der SINGLETON-Hinweis angegeben wurde, ein Knoten jedoch mehr als einmal in seinem übergeordneten Element oder Vorgänger vorkommt, dann wird ein Fehler ausgelöst, wenn Sie den Index (für vorhandene Daten) erstellen, oder wenn Sie eine Abfrage (für neue Daten) ausführen.

DATA TYPE-Optimierungshinweis

Gilt für: XQuery-Datentypen

Mit dem DATENTYP-Optimierungshinweis können Sie einen XQuery- oder SQL Server-Datentyp für den indizierten Knoten angeben. Der Datentyp wird in der Datentabelle des selektiven XML-Indexes für die Spalte verwendet, die dem indizierten Knoten entspricht.

Wenn beim Umwandeln eines vorhandenen Werts in den angegebenen Datentyp ein Fehler auftritt, schlägt der Einfügevorgang (in den Index) nicht fehl. Ein NULL-Wert wird jedoch in die Datentabelle des Indexes eingefügt.

MAXLENGTH-Optimierungshinweis

Gilt für: XQuery-Datentypen

Mit dem MAXLENGTH-Optimierungshinweis können Sie die Länge der xs:string-Daten einschränken. MAXLENGTH ist für SQL Server-Datentypen nicht relevant, da Sie die Länge angeben, wenn Sie die Datentypen VARCHAR oder NVARCHAR angeben.

Wenn eine vorhandene Zeichenfolge länger als der angegebene Wert für MAXLENGTH ist, kommt es beim Einfügen dieses Werts zu einem Fehler.

Beispiel-XML-Dokument für Beispiele

Auf das folgende XML-Beispieldokument wird in den Beispielen in diesem Artikel verwiesen:

<a>
    <b>
         <c atc="aa">10</c>
         <c atc="bb">15</c>
         <d atd1="dd" atd2="ddd">md </d>
    </b>
     <b>
        <c></c>
        <c atc="">117</c>
     </b>
</a>

Siehe auch