Indici nelle colonne con tipo di dati XML

Le istanze XML vengono archiviate nelle colonne di tipo xml come oggetti BLOB (Binary Large Object). 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. Senza un indice, questi oggetti BLOB vengono suddivisi in fase di esecuzione per valutare una query. Questa suddivisione può richiedere molto tempo. Si consideri ad esempio la query seguente:

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

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. In seguito, viene valutata l'espressione (/PD:ProductDescription/@ProductModelID[.="19"]) nel metodo exist(). La suddivisione in fase di esecuzione può essere costosa, a seconda delle dimensioni e del numero di istanze archiviate nella colonna.

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. Tuttavia, la manutenzione dell'indice durante la modifica dei dati presuppone un costo associato.

Gli indici XML rientrano nelle categorie seguenti:

  • Indice XML primario
  • Indice XML secondario

Il primo indice nella colonna di tipo xml deve essere l'indice XML primario, il cui utilizzo consente di supportare i tipi di indici secondari seguenti: PATH, VALUE e PROPERTY. In base al tipo di query, questi indici secondari possono facilitare il miglioramento delle prestazioni delle query.

Indice XML primario

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.

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 principale della struttura XML. Nella colonna Path 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 sottostrutture 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 le relative sottostrutture 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;

Indici XML secondari

Per migliorare le prestazioni della ricerca, è possibile creare indici XML secondari. A tale scopo, deve esistere innanzitutto un indice XML primario. Tipi di indici secondari:

  • Indice XML secondario PATH
  • Indice XML secondario VALUE
  • Indice XML secondario PROPERTY

Indice XML secondario PATH

Se in genere le query specificano espressioni di percorso nelle colonne di tipo xml, un indice secondario PATH potrebbe velocizzare la ricerca. Come descritto più indietro in questo argomento, l'indice primario è utile nel caso di query che specificano il metodo exist() nella clausola WHERE. Se si aggiunge un indice secondario PATH, è possibile migliorare le prestazioni della ricerca in tali query.

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. 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. In tal caso, l'utilizzo di un indice secondario creato in base ai valori di percorso e di nodo dell'indice primario può velocizzare in modo significativo la ricerca nell'indice. Nell'indice secondario PATH, i valori di percorso e di nodo sono colonne chiave che consentono ricerche di percorsi più efficienti. Query Optimizer può utilizzare l'indice PATH per espressioni analoghe alle seguenti:

  • /root/Location, in cui viene specificato solo un percorso

OR

  • /root/Location/@LocationID[.="10"], in cui vengono specificati sia il valore di percorso che il valore di nodo

Nella query seguente viene illustrato il caso in cui è utile l'indice PATH:

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

Nella query l'espressione di percorso /PD:ProductDescription/@ProductModelID e il valore "19" nel metodo exist() corrispondono ai campi chiave dell'indice PATH. In tal modo, è possibile eseguire una ricerca diretta nell'indice PATH e ottenere prestazioni della ricerca migliori rispetto a quelle della ricerca sequenziale di valori di percorso nell'indice primario.

Indice XML secondario VALUE

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 creando un indice XML secondario basato sui valori di nodo dell'indice XML primario.

Le colonne chiave dell'indice VALUE sono il valore di nodo e il percorso dell'indice XML primario. 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. Ad esempio, un indice VALUE risulta vantaggioso per l'espressione seguente:

  • //author[LastName="someName"], in cui si conosce il valore dell'elemento <LastName> ma l'elemento padre <author> può ricorrere in qualsiasi posizione.
  • /book[@* = "someValue"], in cui la query esegue la ricerca dell'elemento <book> che include attributi con il valore "someValue".

La query seguente restituisce ContactID dalla tabella Contact. La clausola WHERE specifica un filtro che esegue la ricerca di valori nella colonna di tipo AdditionalContactInfoxml. Gli ID dei contatti vengono restituiti solo se il BLOB XML con le informazioni aggiuntive corrispondenti include un numero di telefono specifico. Poiché l'elemento <telephoneNumber> può ricorrere in qualsiasi posizione all'interno dell'istanza XML, l'espressione di percorso specifica l'asse descendent-or-self.

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 tal caso, si conosce il valore di ricerca per <number>, ma tale valore può ricorrere in qualsiasi posizione all'interno dell'istanza XML come elemento figlio dell'elemento <telephoneNumber>. Per questo tipo di query può risultare utile eseguire una ricerca nell'indice in base a un valore specifico.

Indice secondario PROPERTY

Per le query che recuperano uno o più valori da singole istanze XML può essere utile un indice PROPERTY. Questo scenario 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.

L'indice PROPERTY viene creato 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.

Ad esempio, per il modello di prodotto 19, la query seguente recupera i valori degli attributi ProductModelID e ProductModelName tramite il metodo value(). Anziché utilizzare l'indice XML primario o gli altri indici XML secondari, l'indice PROPERTY consente di velocizzare l'esecuzione.

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

Ad eccezione delle differenze descritte più avanti in questo argomento, la creazione di un indice XML in una colonna di tipo xml è simile alla creazione di un indice in una colonna di tipo non xml. Per la creazione e la gestione di indici XML, è possibile utilizzare le istruzioni DDL Transact-SQL seguenti:

Creazione di un indice XML primario

Per creare un indice XML primario, utilizzare l'istruzione DDL Transact-SQL CREATE PRIMARY XML INDEX. Negli indici XML non sono supportate tutte le opzioni disponibili per gli indici non XML.

Per la creazione di un indice XML, si noti quanto segue:

  • Per creare un indice XML primario, è necessario che la tabella contenente la colonna XML da indicizzare, denominata tabella di base, includa un indice cluster nella chiave primaria. In tal modo si garantisce che, nel caso in cui la tabella di base sia partizionata, sia possibile partizionare l'indice XML primario tramite lo stesso schema e la stessa funzione di partizionamento.
  • Se è presente un indice XML, non è possibile modificare la chiave primaria cluster della tabella. Prima di modificarla, sarà necessario eliminare tutti gli indici XML dalla tabella.
  • È possibile creare un indice XML primario in una singola colonna di tipo xml. Non è possibile creare nessun altro tipo di indice se la colonna di tipo XML è una colonna chiave. È tuttavia possibile includere la colonna di tipo L xml in un indice non XML. Ogni colonna di tipo xml in una tabella può includere l'indice XML primario corrispondente. È tuttavia consentito solo un indice XML primario per ogni colonna di tipo xml.
  • Gli indici XML si trovano nello stesso spazio dei nomi degli indici non XML. Pertanto, nella stessa tabella non possono esistere un indice XML e un indice non XML con lo stesso nome.
  • Per gli indici XML, le opzioni IGNORE_DUP_KEY e ONLINE sono sempre impostate su OFF. È possibile specificare queste opzioni con il valore OFF.
  • Le informazioni sul filegroup o sul partizionamento della tabella utente vengono applicate all'indice XML. Gli utenti non possono specificare tali informazioni separatamente in un indice XML.
  • L'opzione per gli indici DROP_EXISTING consente di eliminare un indice XML primario e di crearne uno nuovo oppure di eliminare un indice XML secondario e di crearne uno nuovo. Tale opzione, tuttavia, non consente di eliminare un indice XML secondario per creare un nuovo indice XML primario o viceversa.
  • Per i nomi degli indici XML primari vengono applicate le stesse restrizioni valide per i nomi delle viste.

Non è possibile creare un indice XML in una colonna di tipo xml in una vista, in una variabile valutata a livello di tabella con colonne di tipoxml o in variabili di tipo xml.

  • Per modificare una colonna di tipo xml da XML non tipizzato a XML tipizzato, o viceversa, tramite l'opzione ALTER TABLE ALTER COLUMN, nella colonna non deve esistere alcun indice XML. In caso contrario, è necessario eliminarlo prima di provare a modificare il tipo della colonna.

  • Dopo la creazione di un indice XML, è necessario impostare l'opzione ARITHABORT su ON. Per eseguire operazioni di query, inserimento, eliminazione o aggiornamento sui valori della colonna XML utilizzando i metodi con tipo di dati XML, è necessario impostare la stessa opzione nella connessione. In caso contrario, i metodi con tipo di dati XML avranno esito negativo.

    [!NOTA] Le informazioni su un indice XML sono disponibili nelle viste del catalogo. Tuttavia, sp_helpindex non è supportata. In questo argomento sono disponibili esempi che illustrano l'esecuzione di query sulle viste del catalogo per trovare informazioni sugli indici XML.

Creazione di un indice XML secondario

Per creare indici XML secondari e specificare il tipo di indice XML secondario desiderato, utilizzare l'istruzione DDL Transact-SQL CREATE XML INDEX.

Per la creazione di indici XML secondari, si noti quanto segue:

  • Per gli indici XML secondari sono consentite tutte le opzioni applicate a un indice non cluster, ad eccezione di IGNORE_DUP_KEY e di ONLINE. Per gli indici XML secondari, le due opzioni devono essere impostate sempre su OFF.
  • Gli indici secondari vengono partizionati esattamente come l'indice XML primario.
  • L'opzione DROP_EXISTING consente di eliminare un indice secondario dalla tabella utente e di crearne un altro.

È possibile eseguire una query nella vista del catalogo sys.xml_indexes per recuperare informazioni sugli indici XML. Si noti che la colonna seconday_type_desc nella vista del catalogo sys.xml_indexes include il tipo di indice secondario.

SELECT  * 
FROM    sys.xml_indexes

I valori restituiti nella colonna seconday_type_desc possono essere NULL, PATH, VALUE o PROPERTY. Per l'indice XML primario, il valore restituito è NULL.

Modifica di un indice XML

Per modificare indici XML e non XML esistenti, è possibile utilizzare l'istruzione DDL Transact-SQL ALTER INDEX. Per gli indici XML, tuttavia, non sono disponibili tutte le opzioni ALTER INDEX. Per la modifica degli indici XML non sono valide le opzioni seguenti:

  • Per gli indici XML non è valida l'opzione di ricostruzione e impostazione IGNORE_DUP_KEY. Per gli indici XML secondari è necessario impostare l'opzione di ricostruzione ONLINE su OFF. Nell'istruzione ALTER INDEX non è consentita l'opzione DROP_EXISTING. Per la ricostruzione dell'indice, è necessario impostare le opzioni di connessione come descritto in Impostazione di opzioni (Indice XML).
  • Le modifiche al vincolo di chiave primaria nella tabella utente non vengono propagate automaticamente agli indici XML. L'utente deve prima eliminare gli indici XML e quindi ricrearli.
  • Se viene specificata l'opzione ALTER INDEX ALL, questa viene applicata agli indici sia XML che non XML. È possibile che vengano specificate opzioni di indicizzazione che non sono valide per entrambi i tipi di indici. In tal caso, l'intera istruzione ha esito negativo.

Eliminazione di un indice XML

Per eliminare indici XML e non XML primari o secondari esistenti, è possibile utilizzare l'istruzione Transact-SQL DROP INDEX. Tuttavia, nessuna opzione dell'istruzione DROP INDEX si applica agli indici XML. Se si elimina l'indice XML primario, vengono eliminati anche gli indici secondari presenti.

La sintassi DROP con TableName**.**IndexName è obsoleta e non è supportata per gli indici XML.

Esempi

Negli esempi seguenti vengono illustrate la creazione, la modifica e l'eliminazione degli indici XML.

A. Creazione ed eliminazione di un indice XML primario

Nell'esempio seguente viene creato un indice XML in una colonna di tipo xml.

DROP TABLE T
GO
CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create Primary XML index 
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Verify the index creation. 
-- Note index type is 3 for xml indexes.
-- Note the type 3 is index on XML type.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol' 
-- Drop the index.
DROP INDEX PIdx_T_XmlCol ON T

Quando si elimina una tabella, vengono eliminati automaticamente anche tutti i relativi indici XML. Non è tuttavia possibile eliminare una colonna XML da una tabella se tale colonna include un indice XML.

Nell'esempio seguente viene creato un indice XML in una colonna di tipo xml. Per ulteriori informazioni, vedere Codice XML tipizzato e non tipizzato.

CREATE TABLE TestTable(
 Col1 int primary key, 
 Col2 xml (Production.ProductDescriptionSchemaCollection)) 
GO

A questo punto, è possibile creare un indice XML primario in Co12.

CREATE PRIMARY XML INDEX PIdx_TestTable_Col2 
ON TestTable(Col2)
GO

B. Creazione di indici XML secondari

Nell'esempio seguente viene illustrata la creazione di indici XML secondari. Vengono inoltre fornite informazioni sugli indici XML creati.

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create primary index.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Create secondary indexes (PATH, VALUE, PROPERTY).
CREATE XML INDEX PIdx_T_XmlCol_PATH ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PATH
GO
CREATE XML INDEX PIdx_T_XmlCol_VALUE ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR VALUE
GO
CREATE XML INDEX PIdx_T_XmlCol_PROPERTY ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PROPERTY
GO

È possibile eseguire query in sys.xml_indexes per recuperare informazioni sugli indici XML. La colonna secondary_type_desc contiene il tipo di indice secondario.

SELECT  * 
FROM    sys.xml_indexes

È inoltre possibile eseguire una query nella vista del catalogo per ottenere informazioni sugli indici.

SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')

È possibile aggiungere dati di esempio e quindi rivedere le informazioni sugli indici XML.

INSERT INTO T VALUES (1,
'<doc id="123">
<sections>
<section num="2">
<heading>Background</heading>
</section>
<section num="3">
<heading>Sort</heading>
</section>
<section num="4">
<heading>Search</heading>
</section>
</sections>
</doc>')
GO
-- Check XML index information.
SELECT *
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, NULL, 'DETAILED')
GO
-- Space usage of primary XML index
DECLARE @index_id int
SELECT  @index_id = i.index_id
FROM    sys.xml_indexes i 
WHERE   i.name = 'PIdx_T_XmlCol' and object_name(i.object_id) = 'T'
 
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED')
go
--- Space usage of secondary XML index (for example PATH secondary index)  PIdx_T_XmlCol_PATH
DECLARE @index_id int
SELECT  @index_id = i.index_id 
FROM    sys.xml_indexes i 
WHERE  i.name = 'PIdx_T_XmlCol_PATH' and object_name(i.object_id) = 'T'
 
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED')
go
 
-- Space usage of all secondary XML indexes for a particular table
SELECT i.name, object_name(i.object_id), stats.* 
FROM   sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, DEFAULT, 'DETAILED') stats
JOIN sys.xml_indexes i ON (stats.object_id = i.object_id and stats.index_id = i.index_id)
WHERE secondary_type is not null
-- Drop secondary indexes.
DROP INDEX PIdx_T_XmlCol_PATH ON T
GO
DROP INDEX PIdx_T_XmlCol_VALUE ON T
GO
DROP INDEX PIdx_T_XmlCol_PROPERTY ON T
GO
-- Drop primary index.
DROP INDEX PIdx_T_XmlCol ON T
-- Drop table T.
DROP TABLE T
Go

C. Modifica di un indice XML

Nell'esempio seguente viene creato, e quindi modificato, un indice XML impostando l'opzione ALLOW_ROW_LOCKS su OFF. Quando l'opzione ALLOW_ROW_LOCKS è impostata su OFF, le righe non sono bloccate ed è possibile ottenere l'accesso agli indici specificati tramite blocchi a livello di pagina e di tabella.

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
-- Create primary XML index. 
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlCol)
GO
-- Note the type 3 is index on XML type.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol'

-- Modify and set an index option.
ALTER INDEX PIdx_T_XmlCol on T 
SET (ALLOW_ROW_LOCKS = OFF)

D. Disattivazione e attivazione di un indice XML

Per impostazione predefinita, un indice XML è attivato. Se si disattiva un indice XML, per le query in esecuzione sulla colonna XML non viene utilizzato l'indice XML. Per abilitare un indice XML, utilizzare ALTER INDEX con l'opzione REBUILD.

CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML)
GO
CREATE PRIMARY XML INDEX PIdx_T_XmlCol ON T(XmlCol)
GO
ALTER INDEX PIdx_T_XmlCol on T DISABLE
Go
-- Verify index is disabled.
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T')
AND name='PIdx_T_XmlCol'
-- Rebuild the index.
ALTER INDEX PIdx_T_XmlCol on T REBUILD
Go

E. Creazione di un indice XML tramite l'opzione DROP_EXISTING

Nell'esempio seguente viene creato un indice XML in una colonna (XmlColx). Successivamente, viene creato un altro indice XML con lo stesso nome in una colonna diversa, (XmlColy). Poiché viene specificata l'opzione DROP_EXISTING, viene eliminato l'indice XML esistente in (XmlColx)) e viene creato un nuovo indice XML in (XmlColy).

DROP TABLE T
GO
CREATE TABLE T(Col1 int primary key, XmlColx xml, XmlColy xml)
GO
-- Create XML index on XmlColx.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlColx)
GO
-- Create same name XML index on XmlColy.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol 
ON T(XmlColy) 
WITH (DROP_EXISTING = ON)
-- Verify the index is created on XmlColy.d.
SELECT sc.name 
FROM   sys.xml_indexes si inner join sys.index_columns sic 
ON     sic.object_id=si.object_id and sic.index_id=si.index_id
INNER  join sys.columns sc on sc.object_id=sic.object_id 
AND    sc.column_id=sic.column_id
WHERE  si.name='PIdx_T_XmlCol' 
AND    si.object_id=object_id('T')

Questa query restituisce il nome della colonna in cui viene creato l'indice XML specificato.

Vedere anche

Concetti

Tipo di dati XML
Applicazioni XML di esempio

Altre risorse

sys.dm_db_index_physical_stats

Guida in linea e informazioni

Assistenza su SQL Server 2005