CREATE XML INDEX (Transact-SQL)

Crea un indice XML in una tabella specificata. L'indice può essere creato prima dell'immissione dei dati nella tabella. È possibile creare indici XML per tabelle di un altro database specificando un nome di database completo.

Nota

Per creare un indice relazionale, vedere CREATE INDEX (Transact-SQL). Per informazioni sulla creazione di un indice spaziale, vedere CREATE SPATIAL INDEX (Transact-SQL).

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

Create XML Index 
CREATE [ PRIMARY ] XML INDEX index_name 
    ON <object> ( xml_column_name )
    [ USING XML INDEX xml_index_name 
        [ FOR { VALUE | PATH | PROPERTY } ] ]
    [ WITH ( <xml_index_option> [ ,...n ] ) ]
[ ; ]

<object> ::=
{
    [ database_name. [ schema_name ] . | schema_name. ] 
        table_name
}

<xml_index_option> ::=
{ 
    PAD_INDEX  = { ON | OFF }
  | FILLFACTOR = fillfactor
   | SORT_IN_TEMPDB = { ON | OFF }
    | IGNORE_DUP_KEY = OFF
  | DROP_EXISTING = { ON | OFF }
  | ONLINE = OFF
  | ALLOW_ROW_LOCKS = { ON | OFF }
  | ALLOW_PAGE_LOCKS = { ON | OFF }
  | MAXDOP = max_degree_of_parallelism
}

Argomenti

  • [PRIMARY] XML
    Crea un indice XML sulla colonna xml specificata. Quando viene specificata la parola chiave PRIMARY, viene creato un indice cluster con una chiave cluster costituita dalla chiave di clustering della tabella utente e da un identificatore di nodo XML. Per ogni tabella è possibile creare al massimo 249 indici XML. Quando si crea un indice XML, è necessario tenere presente quanto segue:

    • È necessario che esista un indice cluster sulla chiave primaria della tabella utente.

    • La chiave di clustering della tabella utente può includere al massimo 15 colonne.

    • Per ogni colonna xml di una tabella è possibile creare un indice XML primario e più indici XML secondari.

    • Prima di poter creare un indice XML secondario su una colonna xml, è necessario che per tale colonna esista un indice XML primario.

    • Gli indici XML devono essere creati su una singola colonna xml. Non è possibile creare un indice XML su una colonna non xml né creare un indice relazionale su una colonna xml.

    • Non è possibile creare un indice XML, primario o secondario, su una colonna xml di una vista, su una variabile con valori di tabella con colonne xml oppure su variabili di tipo xml.

    • Non è possibile creare un indice XML primario su una colonna xml calcolata.

    • Le impostazioni delle opzioni SET devono corrispondere a quelle necessarie per le viste indicizzate e gli indici su colonne calcolate. In particolare, l'opzione ARITHABORT deve essere impostata su ON quando viene creato un indice XML e quando vengono inseriti, eliminati o aggiornati valori nella colonna xml. Per ulteriori informazioni, vedere Opzioni SET che hanno effetto sui risultati.

    Per ulteriori informazioni, vedere Indici su colonne con tipo di dati XML.

  • index_name
    Nome dell'indice. I nomi di indice devono essere univoci all'interno di una tabella, ma non all'interno di un database. Inoltre, devono essere conformi alle regole per gli identificatori.

    I nomi di indici XML primari non possono iniziare con i caratteri seguenti: #, ##, @ o @@.

  • xml_column_name
    Colonna xml su cui l'indice è basato. È possibile specificare una sola colonna xml in una singola definizione di indice XML, ma è possibile creare più indici XML secondari su una colonna xml.

  • USING XML INDEX xml_index_name
    Specifica l'indice XML primario da utilizzare per la creazione di un indice XML secondario.

  • FOR { VALUE | PATH | PROPERTY }
    Specifica il tipo di indice XML secondario.

    • VALUE
      Crea un indice XML secondario su colonne con le colonne chiave (valore di nodo e percorso) dell'indice XML primario.

    • PATH
      Crea un indice XML secondario su colonne compilate in base ai valori di percorso e i valori di nodo dell'indice XML primario. Nell'indice secondario PATH i valori di nodo e di percorso sono colonne chiave che consentono di eseguire le ricerche dei percorsi in modo più efficiente.

    • PROPERTY
      Crea un indice XML secondario su colonne (valore di chiave primaria, percorso e nodo) dell'indice XML primario, dove il valore di chiave primaria è la chiave primaria della tabella di base.

<object>::=

Oggetto con nome completo o non qualificato che si desidera indicizzare.

  • database_name
    Nome del database.

  • schema_name
    Nome dello schema a cui appartiene la tabella.

  • table_name
    Nome della tabella da indicizzare.

<xml_index_option> ::=

Specifica le opzioni da utilizzare quando si crea l'indice.

  • PAD_INDEX = { ON | OFF }
    Specifica il riempimento dell'indice. Il valore predefinito è OFF.

    • ON
      La percentuale di spazio disponibile specificata in fillfactor viene applicata alle pagine di livello intermedio dell'indice.

    • OFF o fillfactor non specificato
      Le pagine di livello intermedio vengono riempite poco al di sotto della capacità massima, in modo che lo spazio residuo sia sufficiente per almeno una riga della dimensione massima supportata dall'indice, in base al set di chiavi nelle pagine intermedie.

    L'opzione PAD_INDEX risulta utile solo quando si specifica FILLFACTOR, in quanto PAD_INDEX utilizza la percentuale specificata in FILLFACTOR. Se la percentuale specificata in FILLFACTOR non consente l'inserimento di una riga, Motore di database sostituisce internamente tale percentuale in modo da rendere disponibile lo spazio minimo necessario. Il numero di righe di una pagina intermedia dell'indice non è mai minore di due, indipendentemente dal valore di fillfactor.

  • FILLFACTOR **=**fillfactor
    Specifica una percentuale che indica il livello di riempimento del livello foglia di ogni pagina di indice applicato da Motore di database durante la creazione o la ricompilazione dell'indice. fillfactor deve essere un valore intero compreso tra 1 e 100. Il valore predefinito è 0. Se fillfactor è 100 o 0, tramite Motore di database vengono creati indici con pagine foglia riempite fino alla capacità massima.

    Nota

    I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

    L'impostazione di FILLFACTOR viene applicata solo in fase di creazione o di ricompilazione dell'indice. La percentuale specificata di spazio vuoto delle pagine non viene mantenuta in modo dinamico da Motore di database. Per visualizzare l'impostazione del fattore di riempimento, utilizzare la vista del catalogo sys.indexes.

    Nota importanteImportante

    La creazione di un indice cluster con un valore FILLFACTOR minore di 100 influisce sulla quantità di spazio di archiviazione occupata dai dati perché i dati vengono ridistribuiti da Motore di database durante la creazione dell'indice cluster.

    Per ulteriori informazioni, vedere Fattore di riempimento.

  • SORT_IN_TEMPDB = { ON | OFF }
    Specifica se i risultati temporanei dell'ordinamento devono essere archiviati in tempdb. Il valore predefinito è OFF.

    • ON
      I risultati intermedi dell'ordinamento utilizzati per la compilazione dell'indice vengono archiviati in tempdb. Se tempdb si trova in un set di dischi diverso rispetto al database utente, il tempo necessario per creare un indice potrebbe essere minore. La quantità di spazio su disco utilizzata durante la compilazione dell'indice sarà tuttavia maggiore.

    • OFF
      I risultati intermedi dell'ordinamento vengono archiviati nello stesso database dell'indice.

    Oltre allo spazio necessario nel database utente per la creazione dell'indice, in tempdb deve essere disponibile una quantità di spazio aggiuntivo pressoché equivalente per l'archiviazione dei risultati intermedi dell'ordinamento. Per ulteriori informazioni, vedere tempdb e creazione dell'indice.

  • IGNORE_DUP_KEY **=**OFF
    Non ha effetto per gli indici XML perché il tipo di indice non è mai univoco. Non impostare questa opzione su ON altrimenti viene generato un errore.

  • DROP_EXISTING = { ON | OFF }
    Specifica che è necessario eliminare e quindi ricompilare l'indice XML denominato preesistente. Il valore predefinito è OFF.

    • ON
      L'indice esistente deve essere eliminato e ricompilato. Il nome di indice specificato deve corrispondere a quello dell'indice esistente, mentre la definizione dell'indice può essere modificata. È possibile, ad esempio, specificare valori diversi per le colonne, il tipo di ordinamento, lo schema di partizione o le opzioni dell'indice.

    • OFF
      Se il nome di indice specificato esiste già, viene visualizzato un messaggio di errore.

    Il tipo di indice non può essere modificato tramite l'opzione DROP_EXISTING. Non è inoltre possibile ridefinire un indice XML primario come indice XML secondario o viceversa.

  • ONLINE **=**OFF
    Specifica che le tabelle sottostanti e gli indici associati non sono disponibili per le query e la modifica dei dati durante l'operazione sull'indice. In questa versione di SQL Server, le operazioni di compilazione di indici online non sono supportate per gli indici XML. Se questa opzione è impostata su ON per un indice XML, viene generato un errore. Omettere l'opzione ONLINE o impostare ONLINE su OFF.

    Un'operazione offline sull'indice che crea, ricompila o elimina un indice XML acquisisce un blocco di modifica dello schema (SCH-M) per la tabella. Tale blocco impedisce agli utenti di accedere alla tabella sottostante per la durata dell'operazione.

    Nota

    Le operazioni sugli indici online sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

  • ALLOW_ROW_LOCKS = { ON | OFF }
    Specifica se sono consentiti blocchi a livello di riga. Il valore predefinito è ON.

    • ON
      I blocchi a livello di riga sono consentiti durante l'accesso all'indice. Motore di database determina quando utilizzare blocchi a livello di riga.

    • OFF
      I blocchi a livello di riga non vengono utilizzati.

  • ALLOW_PAGE_LOCKS = { ON | OFF }
    Specifica se sono consentiti blocchi a livello di pagina. Il valore predefinito è ON.

    • ON
      I blocchi a livello di pagina sono consentiti durante l'accesso all'indice. Motore di database determina quando utilizzare blocchi a livello di pagina.

    • OFF
      I blocchi a livello di pagina non vengono utilizzati.

  • MAXDOP **=**max_degree_of_parallelism
    Ignora l'opzione di configurazione max degree of parallelism per tutta la durata dell'operazione sull'indice. Utilizzare MAXDOP per limitare il numero di processori utilizzati durante l'esecuzione di un piano parallelo. Il valore massimo è 64 processori.

    Nota importanteImportante

    Sebbene l'opzione MAXDOP sia supportata a livello di sintassi per tutti gli indici XML, per un indice XML primario CREATE XML INDEX utilizza solo un processore singolo.

    I possibili valori di max_degree_of_parallelism sono i seguenti:

    • 1
      Disattiva la generazione di piani paralleli.

    • >1
      Consente di limitare al valore specificato, o a un valore più basso in base al carico di lavoro corrente del sistema, il numero massimo di processori utilizzati in un'operazione parallela sugli indici.

    • 0 (predefinito)
      Utilizza il numero effettivo di processori o un numero inferiore in base al carico di lavoro corrente del sistema.

    Per ulteriori informazioni, vedere Configurazione di operazioni parallele sugli indici.

    Nota

    Le operazioni parallele sugli indici sono disponibili solo nelle edizioni Enterprise, Developer ed Evaluation di SQL Server.

Osservazioni

Le colonne calcolate che derivano da tipi di dati xml possono essere indicizzate come colonna chiave o come colonna non chiave inclusa a condizione che il tipo di dati della colonna calcolata sia supportato come colonna chiave o colonna non chiave dell'indice. Non è possibile creare un indice XML primario su una colonna xml calcolata.

Per visualizzare informazioni relative agli indici XML, utilizzare la vista del catalogo sys.xml_indexes.

Per ulteriori informazioni sugli indici XML, vedere Indici su colonne con tipo di dati XML.

Osservazioni aggiuntive sulla creazione dell'indice

Per ulteriori informazioni sulla creazione dell'indice, vedere la sezione "Osservazioni" in CREATE INDEX (Transact-SQL).

Esempi

A. Creazione di un indice XML primario

Nell'esempio seguente viene creato un indice XML primario sulla colonna CatalogDescription della tabella Production.ProductModel.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT * FROM sys.indexes
            WHERE name = N'PXML_ProductModel_CatalogDescription')
    DROP INDEX PXML_ProductModel_CatalogDescription 
        ON Production.ProductModel;
GO
CREATE PRIMARY XML INDEX PXML_ProductModel_CatalogDescription
    ON Production.ProductModel (CatalogDescription);
GO

B. Creazione di un indice XML secondario

Nell'esempio seguente viene creato un indice XML secondario sulla colonna CatalogDescription della tabella Production.ProductModel.

USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT name FROM sys.indexes
            WHERE name = N'IXML_ProductModel_CatalogDescription_Path')
    DROP INDEX IXML_ProductModel_CatalogDescription_Path
        ON Production.ProductModel;
GO
CREATE XML INDEX IXML_ProductModel_CatalogDescription_Path 
    ON Production.ProductModel (CatalogDescription)
    USING XML INDEX PXML_ProductModel_CatalogDescription FOR PATH ;
GO