Creazione di indici XMLCreate XML Indexes

Questo argomento descrive come creare, modificare e utilizzare indici XML primari e secondari.This topic describes how to create primary and secondary XML indexes.

Creazione di un indice XML primarioCreating a Primary XML Index

Per creare un indice XML primario, usare l'istruzione DDL CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL.To create a primary XML index, use the CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL DDL statement. Negli indici XML non sono supportate tutte le opzioni disponibili per gli indici non XML.Not all options available for non-XML indexes are supported on XML indexes.

Per la creazione di un indice XML, si noti quanto segue:Note the following when you are creating an XML index:

  • 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.To create a primary XML index, the table that contains the XML column being indexed, called the base table, must have a clustered index on the primary key. 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.This makes sure that if the base table is partitioned, the primary XML index can be partitioned by using the same partitioning scheme and partitioning function.

  • Se è presente un indice XML, non è possibile modificare la chiave primaria cluster della tabella.If an XML index exists, the clustered, primary key of the table cannot be modified. Prima di modificarla, sarà necessario eliminare tutti gli indici XML dalla tabella.You will have to drop all XML indexes on the table before modifying the primary key.

  • È possibile creare un indice XML primario in una singola colonna di tipo xml .A primary XML index can be created on a single xml type column. Non è possibile creare nessun altro tipo di indice se la colonna di tipo XML è una colonna chiave.You cannot create any other type of index with the XML type column as a key column. È comunque possibile includere la colonna di tipo L xml in un indice non XML.However, you can include the xml L type column in a non-XML index. Ogni colonna di tipo xml in una tabella può includere l'indice XML primario corrispondente.Each xml type column in a table can have its own primary XML index. Tuttavia, è consentito un solo indice XML primario per ogni colonna di tipo xml .However, only one primary XML index per xml type column is permitted.

  • Gli indici XML si trovano nello stesso spazio dei nomi degli indici non XML.XML indexes exist in the same namespace as non-XML indexes. Pertanto, nella stessa tabella non possono esistere un indice XML e un indice non XML con lo stesso nome.Therefore, you cannot have an XML index and a non-XML index on the same table with the same name.

  • Per gli indici XML, le opzioni IGNORE_DUP_KEY e ONLINE sono sempre impostate su OFF.IGNORE_DUP_KEY and ONLINE options of are always set to OFF for XML indexes. È possibile specificare queste opzioni con il valore OFF.You can specify these options with a value of OFF.

  • Le informazioni sul filegroup o sul partizionamento della tabella utente vengono applicate all'indice XML.The filegroup or partitioning information of the user table is applied to the XML index. Gli utenti non possono specificare tali informazioni separatamente in un indice XML.Users cannot specify these separately on an XML index.

  • 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.The DROP_EXISTING index option can drop a primary XML index and create a new primary XML index, or drop a secondary XML index and create a new secondary XML index. Tale opzione, tuttavia, non consente di eliminare un indice XML secondario per creare un nuovo indice XML primario o viceversa.However, this option cannot drop a secondary XML index to create a new primary XML index or vice versa.

  • Per i nomi degli indici XML primari vengono applicate le stesse restrizioni valide per i nomi delle viste.Primary XML index names have the same restrictions as view names.

    Non è possibile creare un indice XML in una colonna di tipo xml in una vista, in una variabile con valori di tabella con colonne di tipo xml o in variabili di tipo xml .You cannot create an XML index on an xml type column in a view, on a table valued variable with xml type columns, or xml type variables.

  • Per modificare una colonna di tipo xml da XML non tipizzato a XML tipizzato o viceversa, usando l'opzione ALTER TABLE ALTER COLUMN, nella colonna non deve esistere alcun indice XML.To change an xml type column from untyped to typed XML, or vice versa, by using the ALTER TABLE ALTER COLUMN option, no XML index on the column should exist. In caso contrario, è necessario eliminarlo prima di provare a modificare il tipo della colonna.If one does exist, it must be dropped before the column type change is tried.

  • Dopo la creazione di un indice XML, è necessario impostare l'opzione ARITHABORT su ON.The option ARITHABORT must be set to ON when an XML index is created. 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.To query, insert, delete, or update values in the XML column using XML data type methods, the same option must be set on the connection. In caso contrario, i metodi con tipo di dati XML avranno esito negativo.If it is not, the XML data type methods will fail.

    Nota

    Le informazioni su un indice XML sono disponibili nelle viste del catalogo.Information about an XML index can be found in catalog views. Tuttavia, sp_helpindex non è supportato.However, sp_helpindex is not supported. In questo argomento sono disponibili esempi che illustrano l'esecuzione di query sulle viste del catalogo per trovare informazioni sugli indici XML.Examples provided later in this topic show how to query the catalog views to find XML index information.

    Quando si crea o si ricrea un indice XML primario in una colonna con tipo di dati XML che contiene valori dei tipi XML Schema xs:date o xs:dateTime o dei relativi sottotipi, non meno recenti di un anno, la creazione dell'indice non riuscirà in SQL Server 2008SQL Server 2008 e versioni successive.When creating or recreating a primary XML index on an XML data type column that contains values of the XML Schema types xs:date or xs:dateTime (or any subtypes of these types) that have a year of less than 1, the index creation will fail in SQL Server 2008SQL Server 2008 and later versions. SQL Server 2005SQL Server 2005 sono consentiti questi valori, quindi questo problema può verificarsi quando si creano indici in un database generato in SQL Server 2005SQL Server 2005. allowed these values, so this problem can occur when creating indexes in a database generated in SQL Server 2005SQL Server 2005. Per altre informazioni, vedere Confrontare dati XML tipizzati con dati XML non tipizzati.For more information, see Compare Typed XML to Untyped XML.

Esempio: creazione di un indice XML primarioExample: Creating a Primary XML Index

Nella maggior parte degli esempi viene utilizzata la tabella T (pk INT PRIMARY KEY, xCol XML), che include una colonna XML non tipizzata.Table T (pk INT PRIMARY KEY, xCol XML) with an untyped XML column is used in most of the examples. Gli esempi possono essere estesi senza difficoltà ai dati XML tipizzati.These can be extended to typed XML in a straightforward way. Per semplicità vengono descritte le query per le istanze di dati XML, come illustrato nel codice seguente:For simplicity, queries are described for XML data instances as shown in the following:

<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2">  
   <title>Writing Secure Code</title>  
   <author>  
      <first-name>Michael</first-name>  
      <last-name>Howard</last-name>  
   </author>  
   <author>  
      <first-name>David</first-name>  
      <last-name>LeBlanc</last-name>  
   </author>  
   <price>39.99</price>  
</book>  

L'istruzione seguente crea un indice XML chiamato idx_xCol sulla colonna XML chiamata xCol della tabella T:The following statement creates an XML index, called idx_xCol, on the XML column xCol of table T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)  

Creazione di un indice XML secondarioCreating a Secondary XML Index

Usare l'istruzione DDL CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL per creare indici XML secondari e specificare il tipo di indice XML secondario desiderato.Use the CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL DDL statement to create secondary XML indexes and specify the type of the secondary XML index that you want.

Per la creazione di indici XML secondari, si noti quanto segue:Note the following when you are creating secondary XML indexes:

  • 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.All indexing options that apply to a nonclustered index, except IGNORE_DUP_KEY and ONLINE, are permitted on secondary XML indexes. Per gli indici XML secondari, le due opzioni devono essere impostate sempre su OFF.The two options must always be set to OFF for secondary XML indexes.

  • Gli indici secondari vengono partizionati esattamente come l'indice XML primario.The secondary indexes are partitioned just like the primary XML index.

  • L'opzione DROP_EXISTING consente di eliminare un indice secondario dalla tabella utente e di crearne un altro.DROP_EXISTING can drop a secondary index on the user table and create another secondary index on the user table.

    È possibile eseguire una query nella vista del catalogo sys.xml_indexes per recuperare informazioni sull'indice XML.You can query the sys.xml_indexes catalog view to retrieve XML index information. La colonna seconday_type_desc nella vista del catalogo sys.xml_indexes include il tipo di indice secondario:Note that the secondary_type_desc column in the sys.xml_indexes catalog view provides the type of secondary index:

SELECT  *   
FROM    sys.xml_indexes;  

I valori restituiti nella colonna seconday_type_desc possono essere NULL, PATH, VALUE o PROPERTY.The values returned in the secondary_type_desc column can be NULL, PATH, VALUE, or PROPERTY. Per l'indice XML primario, il valore restituito è NULL.For the primary XML index, the value returned is NULL.

Esempio: creazione di indici XML secondariExample: Creating Secondary XML Indexes

Nell'esempio seguente viene illustrata la creazione di indici XML secondari.The following example illustrates how secondary XML indexes are created. Vengono inoltre fornite informazioni sugli indici XML creati.The example also shows information about the XML indexes that you created.

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.You can query the sys.xml_indexes to retrieve XML indexes information. La colonna secondary_type_desc contiene il tipo di indice secondario.The secondary_type_desc column provides the secondary index type.

SELECT  *   
FROM    sys.xml_indexes;  

È inoltre possibile eseguire una query nella vista del catalogo per ottenere informazioni sugli indici.You can also query the catalog view for index information.

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

È possibile aggiungere dati di esempio e quindi rivedere le informazioni sugli indici XML.You can add sample data and then review the XML index information.

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  

Vedere ancheSee Also

Indici XML (SQL Server) XML Indexes (SQL Server)
Dati XML (SQL Server)XML Data (SQL Server)