Indici XML (SQL Server)XML Indexes (SQL Server)

È possibile creare indici XML sulle colonne con tipo di dati xml .XML indexes can be created on xml data type columns. Tutti i tag, i valori e i percorsi delle istanze XML presenti nella colonna vengono indicizzati, migliorando le prestazioni delle query.They index all tags, values and paths over the XML instances in the column and benefit query performance. Per le applicazioni in uso l'utilizzo di un indice XML può risultare vantaggioso nelle situazioni seguenti:Your application may benefit from an XML index in the following situations:

  • Le query sulle colonne XML sono frequenti nel carico di lavoro.Queries on XML columns are common in your workload. È necessario tenere in considerazione il costo di manutenzione dell'indice XML durante la modifica dei dati.XML index maintenance cost during data modification must be considered.

  • I valori XML sono di grandi dimensioni mentre le parti recuperate sono relativamente piccole.Your XML values are relatively large and the retrieved parts are relatively small. Compilando un indice sarà possibile evitare l'analisi completa dei dati in fase di esecuzione ed eseguire ricerche basate sull'indice per una efficiente elaborazione delle query.Building the index avoids parsing the whole data at run time and benefits index lookups for efficient query processing.

    Gli indici XML rientrano nelle categorie seguenti:XML indexes fall into the following categories:

  • Indice XML primarioPrimary XML index

  • Indice XML secondarioSecondary XML index

    Il primo indice nella colonna di tipo xml deve essere l'indice XML primario,The first index on the xml type column must be the primary XML index. il cui utilizzo consente di supportare i tipi di indici secondari seguenti: PATH, VALUE e PROPERTY.Using the primary XML index, the following types of secondary indexes are supported: PATH, VALUE, and PROPERTY. In base al tipo di query, questi indici secondari possono facilitare il miglioramento delle prestazioni delle query.Depending on the type of queries, these secondary indexes might help improve query performance.

Nota

Non è possibile creare o modificare un indice XML a meno che le opzioni del database siano correttamente impostate per l'uso del tipo di dati xml .You cannot create or modify an XML index unless the database options are set correctly for working with the xml data type. Per altre informazioni, vedere Utilizzo della ricerca full-text con colonne XML.For more information, see Use Full-Text Search with XML Columns.

Le istanze XML vengono archiviate nelle colonne di tipo xml come oggetti BLOB (Binary Large Object).XML instances are stored in xml type columns as large binary objects (BLOBs). Tali istanze XML possono essere di grandi dimensioni e la rappresentazione binaria archiviata delle istanze del tipo di dati xml può raggiungere dimensioni massime di 2 GB.These XML instances can be large, and the stored binary representation of xml data type instances can be up to 2 GB. Senza un indice, questi oggetti BLOB vengono suddivisi in fase di esecuzione per valutare una query.Without an index, these binary large objects are shredded at run time to evaluate a query. Questa suddivisione può richiedere molto tempo.This shredding can be time-consuming. Si consideri ad esempio la query seguente:For example, consider the following query:

WITH XMLNAMESPACES ('http://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  

Per selezionare le istanze XML che soddisfano la condizione della clausola WHERE , gli oggetti BLOB XML in ogni riga della tabella Production.ProductModel vengono suddivisi in fase di esecuzione.To select the XML instances that satisfy the condition in the WHERE clause, the XML binary large object (BLOB) in each row of table Production.ProductModel is shredded at run time. In seguito, viene valutata l'espressione (/PD:ProductDescription/@ProductModelID[.="19"]) nel metodo exist() .Then, the expression (/PD:ProductDescription/@ProductModelID[.="19"]) in the exist() method is evaluated. La suddivisione in fase di esecuzione può essere costosa, a seconda delle dimensioni e del numero di istanze archiviate nella colonna.This run-time shredding can be costly, depending on the size and number of instances stored in the column.

Se l'esecuzione di query sugli oggetti BLOB XML è un processo comune nell'ambiente di lavoro specifico, può facilitare l'indicizzazione delle colonne di tipo xml .If querying XML binary large objects (BLOBs) is common in your application environment, it helps to index the xml type columns. Tuttavia, la manutenzione dell'indice durante la modifica dei dati presuppone un costo associato.However, there is a cost associated with maintaining the index during data modification.

Indice XML primarioPrimary XML Index

L'indice XML primario consente di indicizzare tutti i tag, i valori e i percorsi contenuti nelle istanze XML di una colonna XML.The primary XML index indexes all tags, values, and paths within the XML instances in an XML column. Per creare un indice XML primario, è necessario che la tabella contenente la colonna XML da indicizzare includa un indice cluster nella chiave primaria.To create a primary XML index, the table in which the XML column occurs must have a clustered index on the primary key of the table. SQL ServerSQL Server usa questa chiave primaria per correlare righe nell'indice XML primario con le righe nella tabella che contiene la colonna XML. uses this primary key to correlate rows in the primary XML index with rows in the table that contains the XML column.

L'indice XML primario è una rappresentazione suddivisa e persistente degli oggetti BLOB XML contenuti nella colonna con tipo di dati xml .The primary XML index is a shredded and persisted representation of the XML BLOBs in the xml data type column. Per ogni BLOB XML contenuto nella colonna, l'indice crea diverse righe di dati.For each XML binary large object (BLOB) in the column, the index creates several rows of data. Il numero di righe dell'indice corrisponde approssimativamente al numero di nodi del BLOB XML.The number of rows in the index is approximately equal to the number of nodes in the XML binary large object. Quando una query recupera l'istanza XML completa SQL ServerSQL Server fornisce l'istanza dalla colonna XML.When a query retrieves the full XML instance, SQL ServerSQL Server provides the instance from the XML column. Le query all'interno delle istanze XML utilizzano l'indice XML primario e possono restituire valori scalari o sottoalberi XML utilizzando l'indice stesso.Queries within XML instances use the primary XML index, and can return scalar values or XML subtrees by using the index itself.

In ogni riga vengono archiviate le informazioni seguenti:Each row stores the following node information:

  • Nome di tag, ad esempio un nome di elemento o di attributo.Tag name such as an element or attribute name.

  • Valore di nodo.Node value.

  • Tipo di nodo, ad esempio un nodo elemento, un nodo attributo o un nodo testo.Node type such as an element node, attribute node, or text node.

  • Informazioni sull'ordine dei dati nel documento, rappresentate da un identificatore di nodo interno.Document order information, represented by an internal node identifier.

  • Percorso da ogni nodo al nodo radice dell'albero XML.Path from each node to the root of the XML tree. In questa colonna viene eseguita la ricerca delle espressioni di percorso della query.This column is searched for path expressions in the query.

  • Chiave primaria della tabella di base.Primary key of the base table. La chiave primaria della tabella di base viene duplicata nell'indice XML primario per eseguire un join all'indietro con la tabella di base e il numero massimo di colonne nella chiave primaria della tabella di base è limitato a 15.The primary key of the base table is duplicated in the primary XML index for a back join with the base table, and the maximum number of columns in the primary key of the base table is limited to 15.

    Le informazioni sul nodo vengono utilizzate per valutare e costruire i risultati XML di una query specificata.This node information is used to evaluate and construct XML results for a specified query. A scopo di ottimizzazione, il nome di tag e le informazioni sul tipo di nodo vengono codificati come valori integer e per la colonna Path viene utilizzata la stessa codifica.For optimization purposes, the tag name and the node type information are encoded as integer values, and the Path column uses the same encoding. Inoltre, i percorsi vengono archiviati in ordine inverso per consentirne la corrispondenza quando è noto solo il relativo suffisso.Also, paths are stored in reverse order to allow matching paths when only the path suffix is known. Esempio:For example:

  • //ContactRecord/PhoneNumber in cui sono noti solo gli ultimi due passaggi//ContactRecord/PhoneNumber where only the last two steps are known

    OPPUREOR

  • /Book/*/Title in cui il carattere jolly (*) viene specificato nella parte centrale dell'espressione./Book/*/Title where the wildcard character (*) is specified in the middle of the expression.

    Query Processor usa l'indice XML primario per le query che implicano metodi con tipo di dati XML e restituisce valori scalari o sottoalberi XML dall'indice primario stesso.The query processor uses the primary XML index for queries that involve xml Data Type Methods and returns either scalar values or the XML subtrees from the primary index itself. In tale indice vengono archiviate tutte le informazioni necessarie per ricostruire l'istanza XML.(This index stores all the necessary information to reconstruct the XML instance.)

    Ad esempio, la query seguente restituisce informazioni di riepilogo archiviate nella colonna di tipo CatalogDescriptionxml nella tabella ProductModel.For example, the following query returns summary information stored in the CatalogDescriptionxml type column in the ProductModel table. La query restituisce informazioni <Summary> solo per modelli di prodotti la cui descrizione di catalogo contiene inoltre la descrizione <Features>.The query returns <Summary> information only for product models whose catalog description also stores the <Features> description.

WITH XMLNAMESPACES ('http://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  

In relazione all'indice XML primario, anziché suddividere ogni istanza degli oggetti BLOB XML nella tabella di base, nelle righe dell'indice che corrispondono a ogni oggetto BLOB XML viene eseguita la ricerca sequenziale dell'espressione specificata nel metodo exist().With regard to the primary XML index, instead of shredding each XML binary large object instance in the base table, the rows in the index that correspond to each XML binary large object are searched sequentially for the expression specified in the exist() method. Se il percorso viene individuato nella colonna Path dell'indice, l'elemento <Summary> e i relativi sottoalberi vengono recuperati dall'indice XML primario e convertiti in un oggetto BLOB XML come risultato del metodo query().If the path is found in the Path column in the index, the <Summary> element together with its subtrees is retrieved from the primary XML index and converted into an XML binary large object as the result of the query() method.

Si noti che l'indice XML primario non viene utilizzato per il recupero di un'istanza XML completa.Note that the primary XML index is not used when retrieving a full XML instance. Ad esempio, la query seguente recupera dalla tabella l'intera istanza XML che descrive le istruzioni di produzione per un modello di prodotto specifico.For example, the following query retrieves from the table the whole XML instance that describes the manufacturing instructions for a specific product model.

USE AdventureWorks2012;SELECT InstructionsFROM Production.ProductModel WHERE ProductModelID=7;  

Indici XML secondariSecondary XML Indexes

Per migliorare le prestazioni di ricerca, è possibile creare indici XML secondari.To enhance search performance, you can create secondary XML indexes. A tale scopo, deve esistere innanzitutto un indice XML primario, prima di poterne creare di secondari.A primary XML index must first exist before you can create secondary indexes. Tipi di indici secondari:These are the types:

  • Indice XML secondario PATHPATH secondary XML index

  • Indice XML secondario VALUEVALUE secondary XML index

  • Indice XML secondario PROPERTYPROPERTY secondary XML index

    Di seguito sono riportate alcune linee guida per la creazione di uno o più indici di questo tipo:Following are some guidelines for creating one or more secondary indexes:

  • Se nel carico di lavoro viene fatto un utilizzo significativo di espressioni di percorso sulle colonne XML, per migliorare le prestazioni di lavoro è possibile utilizzare l'indice XML secondario PATH.If your workload uses path expressions significantly on XML columns, the PATH secondary XML index is likely to speed up your workload. Il caso più comune è rappresentato dall'uso del metodo exist() sulle colonne XML nella clausola WHERE di Transact-SQL.The most common case is the use of the exist() method on XML columns in the WHERE clause of Transact-SQL.

  • Se il carico di lavoro recupera più valori da singole istanze XML utilizzando espressioni di percorso, può essere utile eseguire il clustering dei percorsi nell'ambito di ogni istanza XML nell'indice PROPERTY.If your workload retrieves multiple values from individual XML instances by using path expressions, clustering paths within each XML instance in the PROPERTY index may be helpful. Questa situazione si presenta in genere negli scenari che prevedono l'utilizzo di contenitori di proprietà, quando vengono recuperate le proprietà di un oggetto di cui è noto il valore della chiave primaria.This scenario typically occurs in a property bag scenario when properties of an object are fetched and its primary key value is known.

  • Se il carico di lavoro richiede l'esecuzione di query per il recupero di valori nelle istanze XML, senza conoscere i nomi degli elementi o attributi che contengono tali valori, sarà possibile creare l'indice VALUE.If your workload involves querying for values within XML instances without knowing the element or attribute names that contain those values, you may want to create the VALUE index. Questa situazione si verifica in genere nelle ricerche su assi discendenti, ad esempio //author[last-name="Howard"], in cui gli elementi <author> possono essere presenti a ogni livello della gerarchia.This typically occurs with descendant axes lookups, such as //author[last-name="Howard"], where <author> elements can occur at any level of the hierarchy. Si verifica anche nelle query che usano caratteri jolly, ad esempio /book [@* = "novel"], in cui la query cerca elementi <book> contenenti un attributo con valore "novel".It also occurs in wildcard queries, such as /book [@* = "novel"], where the query looks for <book> elements that have some attribute having the value "novel".

Indice XML secondario PATHPATH Secondary XML Index

Se in genere le query specificano espressioni di percorso nelle colonne di tipo xml , un indice secondario PATH potrebbe velocizzare la ricerca.If your queries generally specify path expressions on xml type columns, a PATH secondary index may be able to speed up the search. Come precedentemente descritto in questo argomento, l'indice primario è utile nel caso di query che specificano il metodo exist() nella clausola WHERE.As described earlier in this topic, the primary index is helpful when you have queries that specify exist() method in the WHERE clause. Se si aggiunge un indice secondario PATH, è possibile migliorare le prestazioni della ricerca in tali query.If you add a PATH secondary index, you may also improve the search performance in such queries.

Sebbene un indice XML primario consenta di evitare la suddivisione dei BLOB XML in fase di esecuzione, potrebbe non garantire prestazioni ottimali per le query basate su espressioni di percorso.Although a primary XML index avoids having to shred the XML binary large objects at run time, it may not provide the best performance for queries based on path expressions. Poiché in tutte le righe dell'indice XML primario corrispondenti a un BLOB XML viene eseguita la ricerca sequenziale di istanze XML di grandi dimensioni, tale ricerca potrebbe risultare lenta.Because all rows in the primary XML index corresponding to an XML binary large object are searched sequentially for large XML instances, the sequential search may be slow. In tal caso, l'utilizzo di un indice secondario basato sui valori di percorso e di nodo dell'indice primario può velocizzare in modo significativo la ricerca nell'indice.In this case, having a secondary index built on the path values and node values in the primary index can significantly speed up the index search. Nell'indice secondario PATH, i valori di percorso e di nodo sono colonne chiave che consentono ricerche di percorsi più efficienti.In the PATH secondary index, the path and node values are key columns that allow for more efficient seeks when searching for paths. Query Optimizer può utilizzare l'indice PATH per espressioni analoghe alle seguenti:The query optimizer may use the PATH index for expressions such as those shown in the following:

  • /root/Location che specifica solo un percorso/root/Location which specify only a path

    OPPUREOR

  • /root/Location/@LocationID[.="10"] in cui vengono specificati sia il valore di percorso che il valore di nodo./root/Location/@LocationID[.="10"] where both the path and the node value are specified.

    Nella query seguente viene illustrato il caso in cui è utile l'indice PATH:The following query shows where the PATH index is helpful:

WITH XMLNAMESPACES ('http://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  

Nella query l'espressione di percorso /PD:ProductDescription/@ProductModelID e il valore "19" nel metodo exist() corrispondono ai campi chiave dell'indice PATH.In the query, the path expression /PD:ProductDescription/@ProductModelID and value "19" in the exist() method correspond to the key fields of the PATH index. In tal modo, è possibile eseguire una ricerca diretta nell'indice PATH e ottenere prestazioni di ricerca migliori rispetto a quelle della ricerca sequenziale di valori di percorso nell'indice primario.This allows for direct seek in the PATH index and provides better search performance than the sequential search for path values in the primary index.

Indice XML secondario VALUEVALUE Secondary XML Index

Se le query sono basate su valori, come ad esempio nel caso di /Root/ProductDescription/@*[. = "Mountain Bike"] o //ProductDescription[@Name = "Mountain Bike"], e il percorso specificato non è completo o include un carattere jolly, è possibile velocizzare la ricerca compilando un indice XML secondario basato sui valori di nodo dell'indice XML primario.If queries are value based, for example, /Root/ProductDescription/@*[. = "Mountain Bike"] or //ProductDescription[@Name = "Mountain Bike"], and the path is not fully specified or it includes a wildcard, you might obtain faster results by building a secondary XML index that is built on node values in the primary XML index.

Le colonne chiave dell'indice VALUE sono il valore di nodo e il percorso dell'indice XML primario.The key columns of the VALUE index are (node value and path) of the primary XML index. Se il carico di lavoro implica l'esecuzione di query per valori da istanze XML senza conoscere i nomi di elemento o di attributo che contengono tali valori, un indice VALUE può risultare utile.If your workload involves querying for values from XML instances without knowing the element or attribute names that contain the values, a VALUE index may be useful. Ad esempio, un indice VALUE risulta vantaggioso per l'espressione seguente:For example, the following expression will benefit from having a VALUE index:

  • //author[LastName="someName"] dove si conosce il valore dell'elemento <LastName> ma l'elemento padre <author> può trovarsi ovunque.//author[LastName="someName"] where you know the value of the <LastName> element, but the <author> parent can occur anywhere.

  • /book[@* = "someValue"] dove la query cerca l'elemento <book> che dispone di un qualche attributo con valore "someValue"./book[@* = "someValue"] where the query looks for the <book> element that has some attribute having the value "someValue".

    La query seguente restituisce ContactID dalla tabella Contact .The following query returns ContactID from the Contact table. La clausola WHERE specifica un filtro che esegue la ricerca di valori nella colonna di tipo AdditionalContactInfoxml .The WHERE clause specifies a filter that looks for values in the AdditionalContactInfoxml type column. Gli ID dei contatti vengono restituiti solo se il BLOB XML con le informazioni aggiuntive corrispondenti include un numero di telefono specifico.The contact IDs are returned only if the corresponding additional contact information XML binary large object includes a specific telephone number. Poiché l'elemento <telephoneNumber> può trovarsi ovunque nell'XML, l'espressione del percorso specifica l'asse discendente o stesso.Because the <telephoneNumber> element may appear anywhere in the XML, the path expression specifies the descendent-or-self axis.

WITH XMLNAMESPACES (  
  'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,  
  'http://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 questo caso, il valore di ricerca di <number> è noto ma può trovarsi ovunque nell'istanza XML come figlio dell'elemento <telephoneNumber>.In this situation, the search value for <number> is known, but it can appear anywhere in the XML instance as a child of the <telephoneNumber> element. Per questo tipo di query può risultare utile eseguire una ricerca nell'indice basata su un valore specifico.This kind of query might benefit from an index lookup based on a specific value.

Indice secondario PROPERTYPROPERTY Secondary Index

Per le query che recuperano uno o più valori da singole istanze XML può essere utile un indice PROPERTY.Queries that retrieve one or more values from individual XML instances might benefit from a PROPERTY index. Questa situazione si verifica quando si recuperano proprietà dell'oggetto tramite il metodo value() del tipo xml e quando si conosce il valore della chiave primaria dell'oggetto.This scenario occurs when you retrieve object properties by using the value() method of the xml type and when the primary key value of the object is known.

L'indice PROPERTY viene compilato in base alle colonne PK e Path e al valore di nodo dell'indice XML primario, in cui PK è la chiave primaria della tabella di base.The PROPERTY index is built on columns (PK, Path and node value) of the primary XML index where PK is the primary key of the base table.

Ad esempio, per il modello di prodotto 19, la query seguente recupera i valori degli attributi ProductModelID e ProductModelName tramite il metodo value() .For example, for product model 19, the following query retrieves the ProductModelID and ProductModelName attribute values using the value() method. Anziché utilizzare l'indice XML primario o gli altri indici XML secondari, l'indice PROPERTY consente di velocizzare l'esecuzione.Instead of using the primary XML index or the other secondary XML indexes, the PROPERTY index may provide faster execution.

WITH XMLNAMESPACES ('http://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  

Ad eccezione delle differenze descritte più avanti in questo argomento, la creazione di un indice XML in una colonna di tipoxml è simile alla creazione di un indice in una colonna di tipo nonxml .Except for the differences described later in this topic, creating an XML index on anxml type column is similar to creating an index on a non-xml type column. Per la creazione e la gestione di indici XML, è possibile utilizzare le istruzioni DDL Transact-SQLTransact-SQL seguenti:The following Transact-SQLTransact-SQL DDL statements can be used to create and manage XML indexes:

Informazioni sugli indici XMLGetting Information about XML Indexes

Le voci di un indice XML compaiono nella vista del catalogo sys.indexes con tipo di indice 3.XML index entries appear in the catalog view, sys.indexes, with the index "type" 3. La colonna del nome contiene il nome dell'indice XML.The name column contains the name of the XML index.

Gli indici XML vengono registrati anche nella vista del catalogo sys.xml_indexes,XML indexes are also recorded in the catalog view, sys.xml_indexes. che contiene tutte le colonne della vista sys.indexes e alcune colonne specifiche, utili per gli indici XML.This contains all the columns of sys.indexes and some specific ones that are useful for XML indexes. Il valore NULL nella colonna secondary_type indica un indice XML primario, mentre i valori 'P', 'R' e 'V' indicano, rispettivamente, indici XML secondari di tipo PATH, PROPERTY e VALUE.The value NULL in the column, secondary_type, indicates a primary XML index; the values 'P', 'R' and 'V' stand for PATH, PROPERTY, and VALUE secondary XML indexes, respectively.

Per ottenere informazioni sullo spazio usato dagli indici XML è possibile usare la funzione con valori di tabella sys.dm_db_index_physical_stats.The space use of XML indexes can be found in the table-valued function sys.dm_db_index_physical_stats. che restituisce informazioni come il numero di pagine del disco occupate, le dimensioni medie delle righe in byte e il numero dei record, per tutti i tipi di indici,It provides information, such as the number of disk pages occupied, average row size in bytes, and number of records, for all index types.. inclusi gli indici XML.This also includes XML indexes. Tali informazioni sono disponibili per ogni partizione del database.This information is available for each database partition. Gli indici XML utilizzano lo stesso schema di partizionamento e la stessa funzione di partizionamento della tabella di base.XML indexes use the same partitioning scheme and partitioning function of the base table.

Vedere ancheSee Also

sys.dm_db_index_physical_stats (Transact-SQL) sys.dm_db_index_physical_stats (Transact-SQL)
Dati XML (SQL Server)XML Data (SQL Server)