Condividi tramite


Indice XML primario

L'indice XML primario consente di indicizzare tutti i tag, i valori e i percorsi contenuti nelle istanze XML di una colonna XML. Per creare un indice XML primario, la tabella nella quale si trova la colonna XML deve avere un indice cluster sulla chiave primaria della tabella. SQL Server utilizza questa chiave primaria per correlare righe nell'indice XML primario con le righe nella tabella che contiene la colonna XML.

L'indice XML primario è una rappresentazione suddivisa e persistente degli oggetti BLOB XML contenuti nella colonna con tipo di dati xml. Per ogni BLOB XML contenuto nella colonna, l'indice crea diverse righe di dati. Il numero di righe dell'indice corrisponde approssimativamente al numero di nodi del BLOB XML. Quando una query recupera l'istanza XML completa SQL Serverfornisce l'istanza dalla colonna XML. Le query all'interno delle istanze XML utilizzano l'indice XML primario e possono restituire valori scalari o sottoalberi XML utilizzando l'indice stesso.

In ogni riga vengono archiviate le informazioni seguenti:

  • Nome di tag, ad esempio un nome di elemento o di attributo.

  • Valore di nodo.

  • Tipo di nodo, ad esempio un nodo elemento, un nodo attributo o un nodo testo.

  • Informazioni sull'ordine dei dati nel documento, rappresentate da un identificatore di nodo interno.

  • Percorso da ogni nodo al nodo radice dell'albero XML. In questa colonna viene eseguita la ricerca delle espressioni di percorso della query.

  • Chiave primaria della tabella di base. 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.

Le informazioni sul nodo vengono utilizzate per valutare e costruire i risultati XML di una query specificata. 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. Inoltre, i percorsi vengono archiviati in ordine inverso per consentirne la corrispondenza quando è noto solo il relativo suffisso. Ad esempio:

  • //ContactRecord/PhoneNumber, in cui sono noti solo gli ultimi due passaggi

OR

  • /Book/*/Title in cui il carattere jolly (*) viene specificato nella parte centrale dell'espressione.

Query Processor utilizza 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. In tale indice vengono archiviate tutte le informazioni necessarie per ricostruire l'istanza XML.

Ad esempio, la query seguente restituisce informazioni di riepilogo archiviate nella colonna di tipo CatalogDescriptionxml nella tabella ProductModel. La query restituisce le informazioni <Summary> solo per i modelli di prodotto con descrizioni di catalogo in cui è archiviata anche la descrizione <Features>.

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/PD:Features') = 1

In relazione all'indice XML primario, anziché suddividere ogni instanza 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(). 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().

Si noti che l'indice XML primario non viene utilizzato per il recupero di un'istanza XML completa. Ad esempio, la query seguente recupera dalla tabella l'intera istanza XML che descrive le istruzioni di produzione per un modello di prodotto specifico.

USE AdventureWorks;

SELECT Instructions
FROM Production.ProductModel 
WHERE ProductModelID=7;