Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
XML-Indizes können für xml Datentypspalten erstellt werden. Sie indizieren alle Tags, Werte und Pfade über die XML-Instanzen in der Spalte und verbessern die Abfrageleistung. Ihre Anwendung kann in den folgenden Situationen von einem XML-Index profitieren:
Abfragen zu XML-Spalten werden in Ihrer Workload häufig verwendet. Die Kosten der XML-Indexwartung bei Datenänderungen müssen berücksichtigt werden.
Ihre XML-Werte sind relativ groß und die abgerufenen Teile sind relativ klein. Durch das Erstellen des Indexes wird verhindert, dass die gesamten Daten zur Laufzeit geparst werden, und die Index-Nachschlagevorgänge werden für eine effiziente Abfrageverarbeitung verwendet.
XML-Indizes sind in die folgenden Kategorien unterteilt:
Primärer XML-Index
Sekundärer XML-Index
Der erste Index der xml Typspalte muss der primäre XML-Index sein. Mit dem primären XML-Index werden die folgenden Typen sekundärer Indizes unterstützt: PATH, VALUE und PROPERTY. Je nach Abfragetyp können diese sekundären Indizes dazu beitragen, die Abfrageleistung zu verbessern.
Hinweis
Sie können keinen XML-Index erstellen oder ändern, es sei denn, die Datenbankoptionen sind für die Arbeit mit dem xml Datentyp ordnungsgemäß festgelegt. Weitere Informationen finden Sie unter Verwenden der Full-Text Suche mit XML-Spalten.
XML-Instanzen werden in xml Typspalten als große binäre Objekte (BLOBs) gespeichert. Diese XML-Instanzen können groß sein, und die gespeicherte binäre Darstellung von xml Datentypinstanzen kann bis zu 2 GB betragen. Ohne Index werden diese binären großen Objekte zur Laufzeit zerkleinert, um eine Abfrage auszuwerten. Das Schreddern kann zeitaufwändig sein. Betrachten Sie beispielsweise die folgende Abfrage:
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1
Um die XML-Instanzen auszuwählen, die die Bedingung in der WHERE Klausel erfüllen, wird das XML-binär große Objekt (BLOB) in jeder Zeile der Tabelle Production.ProductModel zur Laufzeit zerkleinert. Anschließend wird der Ausdruck (/PD:ProductDescription/@ProductModelID[.="19"]) in der exist() Methode ausgewertet. Diese Laufzeitschredderung kann je nach Größe und Anzahl der in der Spalte gespeicherten Instanzen kostspielig sein.
Wenn das Abfragen von binär großen XML-Objekten (BLOBs) in Ihrer Anwendungsumgebung üblich ist, hilft es beim Indizieren der xml Typspalten. Es gibt jedoch kostenbedingte Kosten für die Aufrechterhaltung des Indexes während der Datenänderung.
Primärer XML-Index
Der primäre XML-Index indiziert alle Tags, Werte und Pfade innerhalb der XML-Instanzen in einer XML-Spalte. Zum Erstellen eines primären XML-Indexes muss die Tabelle, in der die XML-Spalte auftritt, über einen gruppierten Index für den Primärschlüssel der Tabelle verfügen. SQL Server verwendet diesen Primärschlüssel, um Zeilen im primären XML-Index mit Zeilen in der Tabelle zu korrelieren, die die XML-Spalte enthalten.
Der primäre XML-Index ist eine zerkleinerte und permanente Darstellung der XML-BLOBs in der xml Datentypspalte. Für jedes binäre große XML-Objekt (BLOB) in der Spalte erstellt der Index mehrere Zeilen von Daten. Die Anzahl der Zeilen im Index entspricht ungefähr der Anzahl der Knoten im xml-binär großen Objekt. Wenn eine Abfrage die vollständige XML-Instanz abruft, stellt SQL Server die Instanz aus der XML-Spalte bereit. Abfragen innerhalb von XML-Instanzen verwenden den primären XML-Index und können skalare Werte oder XML-Unterstrukturen mithilfe des Indexes selbst zurückgeben.
Jede Zeile speichert die folgenden Knoteninformationen:
Tagname, wie zum Beispiel ein Element- oder Attributname.
Knotenwert.
Knotentyp, z. B. Elementknoten, Attributknoten oder Textknoten.
Dokumentreihenfolgeinformationen, dargestellt durch einen internen Knotenbezeichner.
Pfad von jedem Knoten zum Stamm der XML-Struktur. In dieser Spalte wird in der Abfrage nach Pfadausdrücken gesucht.
Primärschlüssel der Basistabelle. Der Primärschlüssel der Basistabelle wird im primären XML-Index für eine Back-Verknüpfung mit der Basistabelle dupliziert, und die maximale Anzahl von Spalten im Primärschlüssel der Basistabelle ist auf 15 beschränkt.
Diese Knoteninformationen werden verwendet, um XML-Ergebnisse für eine angegebene Abfrage auszuwerten und zu erstellen. Zu Optimierungszwecken werden der Tagname und die Knotentypinformationen als ganzzahlige Werte codiert, und die Spalte "Pfad" verwendet dieselbe Codierung. Außerdem werden Pfade in umgekehrter Reihenfolge gespeichert, um übereinstimmende Pfade zuzulassen, wenn nur das Pfadsuffix bekannt ist. Beispiel:
-
//ContactRecord/PhoneNumberwobei nur die letzten beiden Schritte bekannt sind
ODER
-
/Book/*/Titlewobei das Wildcardzeichen (*) in der Mitte des Ausdrucks angegeben wird.
Der Abfrageprozessor verwendet den primären XML-Index für Abfragen, die xml-Datentypmethoden umfassen, und gibt entweder skalare Werte oder die XML-Unterstrukturen aus dem primären Index selbst zurück. (In diesem Index werden alle erforderlichen Informationen gespeichert, um die XML-Instanz zu rekonstruieren.)
Die folgende Abfrage gibt beispielsweise Zusammenfassungsinformationen zurück, die in der Typspalte in der CatalogDescription``xmlProductModel Tabelle gespeichert sind. Die Abfrage gibt Informationen nur für Produktmodelle zurück <Summary> , deren Katalogbeschreibung auch die <Features> Beschreibung speichert.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")SELECT CatalogDescription.query(' /PD:ProductDescription/PD:Summary') as ResultFROM Production.ProductModelWHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1
Im Hinblick auf den primären XML-Index werden, anstatt jede Instanz eines großen XML-Binär-Objekts in der Basistabelle zu zerlegen, die Zeilen im Index, die den einzelnen großen XML-Binär-Objekten entsprechen, sequenziell nach dem Ausdruck durchsucht, der in der exist() Methode angegeben ist. Wenn der Pfad in der Spalte "Pfad" im Index gefunden wird, wird das <Summary> Element zusammen mit seinen Unterstrukturen aus dem primären XML-Index abgerufen und als Ergebnis der query() Methode in ein binäres großes XML-Objekt konvertiert.
Beachten Sie, dass der primäre XML-Index beim Abrufen einer vollständigen XML-Instanz nicht verwendet wird. Die folgende Abfrage ruft beispielsweise aus der Tabelle die gesamte XML-Instanz ab, die die Fertigungsanweisungen für ein bestimmtes Produktmodell beschreibt.
USE AdventureWorks2012;SELECT InstructionsFROM Production.ProductModel WHERE ProductModelID=7;
Sekundäre XML-Indizes
Um die Suchleistung zu verbessern, können Sie sekundäre XML-Indizes erstellen. Ein primärer XML-Index muss zuerst vorhanden sein, bevor Sie sekundäre Indizes erstellen können. Dies sind die Typen:
SEKUNDÄRER XML-Index PATH
SEKUNDÄRER WERT-XML-Index
SEKUNDÄRER XML-Index PROPERTY
Im Folgenden sind einige Richtlinien zum Erstellen eines oder mehrerer sekundärer Indizes aufgeführt:
Wenn Ihre Workload Pfadausdrücke in XML-Spalten erheblich verwendet, wird der sekundäre PATH-XML-Index wahrscheinlich Ihre Workload beschleunigen. Der häufigste Fall ist die Verwendung der exist() -Methode für XML-Spalten in der WHERE-Klausel von Transact-SQL.
Wenn Ihre Workload mehrere Werte aus einzelnen XML-Instanzen mithilfe von Pfadausdrücken abruft, können Clusteringpfade innerhalb jeder XML-Instanz im PROPERTY-Index hilfreich sein. Dieses Szenario tritt in der Regel in einem Eigenschaftenbehälterszenario auf, wenn Eigenschaften eines Objekts abgerufen werden und sein Primärschlüsselwert bekannt ist.
Wenn Ihre Arbeitsauslastung das Abfragen von Werten in XML-Instanzen umfasst, ohne dass Sie die Element- oder Attributnamen kennen, die diese Werte enthalten, sollten Sie den WERT-Index erstellen. Dies geschieht in der Regel bei Achs-Abfragen für Nachkommen, z. B. //author[last-name="Howard"], wobei <Autorenelemente> auf jeder Ebene der Hierarchie auftreten können. Sie tritt auch in Wildcardabfragen auf, z. B. /book [@* = "novel"], wobei die Abfrage nach <Buchelementen> sucht, die ein Attribut mit dem Wert "novel" aufweisen.
PFAD Sekundärer XML-Index
Wenn Ihre Abfragen in der Regel Pfadausdrücke für xml Typspalten angeben, kann ein sekundärer PATH-Index die Suche beschleunigen. Wie weiter oben in diesem Thema beschrieben, ist der primäre Index hilfreich bei Abfragen, die "exist()" in der WHERE-Klausel verwenden. Wenn Sie einen sekundären PATH-Index hinzufügen, können Sie auch die Suchleistung in solchen Abfragen verbessern.
Obwohl ein primärer XML-Index nicht zur Laufzeit die XML-binär großen Objekte zerkleinern muss, bietet er möglicherweise nicht die beste Leistung für Abfragen basierend auf Pfadausdrücken. Da alle Zeilen im primären XML-Index, die einem XML-binär großen Objekt entsprechen, sequenziell nach großen XML-Instanzen durchsucht werden, kann die sequenzielle Suche langsam sein. In diesem Fall kann ein sekundärer Index, der auf den Pfadwerten und Knotenwerten im Primärindex basiert, die Indexsuche erheblich beschleunigen. Im sekundären PATH-Index sind die Pfad- und Knotenwerte Schlüsselspalten, die eine effizientere Suche bei der Suche nach Pfaden ermöglichen. Der Abfrageoptimierer kann den PATH-Index für Ausdrücke wie die folgenden verwenden:
-
/root/Locationdie nur einen Pfad angeben
ODER
-
/root/Location/@LocationID[.="10"]wobei sowohl der Pfad als auch der Knotenwert angegeben werden.
Die folgende Abfrage zeigt, wo der PATH-Index hilfreich ist:
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1
In der Abfrage entsprechen der Pfadausdruck /PD:ProductDescription/@ProductModelID und Wert "19" in der exist()-Methode den Schlüsselfeldern des PATH-Indexes. Dies ermöglicht die direkte Suche im PATH-Index und bietet eine bessere Suchleistung als die sequenzielle Suche nach Pfadwerten im Primärindex.
SEKUNDÄRER XML-WERTINDEX
Wenn Abfragen wertbasiert sind, z. B. oder //ProductDescription[@Name = "Mountain Bike"], und der Pfad nicht vollständig angegeben ist oder ein Wildcard enthält, erhalten Sie möglicherweise schnellere Ergebnisse, indem Sie einen sekundären XML-Index erstellen, /Root/ProductDescription/@*[. = "Mountain Bike"] der auf Knotenwerten im primären XML-Index basiert.
Die Schlüsselspalten des WERT-Indexes sind (Knotenwert und Pfad) des primären XML-Indexes. Wenn Ihre Arbeitsauslastung das Abfragen von Werten aus XML-Instanzen umfasst, ohne die Element- oder Attributnamen zu kennen, die die Werte enthalten, kann ein WERT-Index hilfreich sein. Beispielsweise profitiert der folgende Ausdruck von einem WERT-Index:
//author[LastName="someName"]wo Sie den Wert des <LastName> Elements kennen, aber das <author> übergeordnete Element kann überall auftreten./book[@* = "someValue"]wobei die Abfrage nach dem <book> Element sucht, das ein Attribut mit dem Wert"someValue"aufweist.
Die folgende Abfrage gibt ContactID aus der Tabelle Contact zurück. Die WHERE Klausel gibt einen Filter an, der nach Werten in der AdditionalContactInfo``xml Typspalte sucht. Die Kontakt-IDs werden nur zurückgegeben, wenn das entsprechende XML-binäre Objekt der zusätzlichen Kontaktinformationen eine bestimmte Telefonnummer enthält. Da das <telephoneNumber> Element an einer beliebigen Stelle im XML-Code angezeigt werden kann, gibt der Pfadausdruck die absteigende oder selbstachse an.
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)
SELECT ContactID
FROM Person.Contact
WHERE AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1
In diesem Fall ist der Suchwert <number> bekannt, kann aber überall in der XML-Instanz als untergeordnetes Element des <telephoneNumber> Elements angezeigt werden. Diese Art von Abfrage kann von einer Indexsuche auf der Grundlage eines bestimmten Werts profitieren.
SEKUNDÄRINDEX DER EIGENSCHAFT
Abfragen, die einen oder mehrere Werte aus einzelnen XML-Instanzen abrufen, können von einem PROPERTY-Index profitieren. Dieses Szenario tritt auf, wenn Sie Objekteigenschaften mithilfe der Value()- Methode des xml Typs abrufen und wenn der Primärschlüsselwert des Objekts bekannt ist.
Der PROPERTY-Index basiert auf Spalten (PK, Pfad und Knotenwert) des primären XML-Index, wobei PK der Primärschlüssel der Basistabelle ist.
Für das Produktmodell 19ruft beispielsweise die folgende Abfrage die ProductModelID Werte und ProductModelName Attributwerte mithilfe der value() Methode ab. Anstatt den primären XML-Index oder die anderen sekundären XML-Indizes zu verwenden, kann der PROPERTY-Index eine schnellere Ausführung ermöglichen.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")
SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') as ModelID,
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') as ModelName
FROM Production.ProductModel
WHERE ProductModelID = 19
Mit Ausnahme der weiter unten in diesem Thema beschriebenen Unterschiede ähnelt das Erstellen eines XML-Indexes für einexml Typspalte dem Erstellen eines Indexes für einexml Spalte ohne Typ. Die folgenden Transact-SQL DDL-Anweisungen können zum Erstellen und Verwalten von XML-Indizes verwendet werden:
Abrufen von Informationen zu XML-Indizes
XML-Indexeinträge werden in der Katalogansicht, sys.indexes, mit dem Index "type" 3 angezeigt. Die Namensspalte enthält den Namen des XML-Indexes.
XML-Indizes werden auch in der Katalogansicht sys.xml_Indizes aufgezeichnet. Dies enthält alle Spalten von sys.indexes und einige spezifische Spalten, die für XML-Indizes nützlich sind. Der Wert NULL in der Spalte secondary_type gibt einen primären XML-Index an; die Werte "P", "R" und "V" stehen für PFAD-, EIGENSCHAFT- und WERT-sekundäre XML-Indizes.
Die Raumnutzung von XML-Indizes finden Sie in der tabellenwertigen Funktion sys.dm_db_index_physical_stats. Sie enthält Informationen, z. B. die Anzahl der belegten Datenträgerseiten, die durchschnittliche Zeilengröße in Byte und die Anzahl der Datensätze für alle Indextypen. Dazu gehören auch XML-Indizes. Diese Informationen sind für jede Datenbankpartition verfügbar. XML-Indizes verwenden dieselbe Partitionierungsschema- und Partitionierungsfunktion der Basistabelle.
Siehe auch
sys.dm_db_index_physical_stats (Transact-SQL)
XML-Daten (SQL Server)