Share via


ALTER INDEX (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

Consente di modificare un indice di tabella o di vista esistente, di tipo rowstore, columnstore o XML, tramite la disabilitazione, la ricompilazione o la riorganizzazione dell'indice oppure tramite l'impostazione di opzioni per l'indice.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

Sintassi per SQL Server, database SQL di Azure e Istanza gestita di SQL di Azure.

ALTER INDEX { index_name | ALL } ON <object>
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> [ , ...n ] ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ , ...n ] ) ] ]
      }
    | DISABLE
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]
    | SET ( <set_index_option> [ , ...n ] )
    | RESUME [ WITH (<resumable_index_option> [ , ...n ] ) ]
    | PAUSE
    | ABORT
}
[ ; ]

<object> ::=
{
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
}

<rebuild_index_option> ::=
{
      PAD_INDEX = { ON | OFF }
    | FILLFACTOR = fillfactor
    | SORT_IN_TEMPDB = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }
    | STATISTICS_NORECOMPUTE = { ON | OFF }
    | STATISTICS_INCREMENTAL = { ON | OFF }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ] }

<single_partition_rebuild_index_option> ::=
{
      SORT_IN_TEMPDB = { ON | OFF }
    | MAXDOP = max_degree_of_parallelism
    | RESUMABLE = { ON | OFF }
    | MAX_DURATION = <time> [ MINUTES ]
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }
}

<reorganize_option> ::=
{
       LOB_COMPACTION = { ON | OFF }
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF }
}

<set_index_option> ::=
{
      ALLOW_ROW_LOCKS = { ON | OFF }
    | ALLOW_PAGE_LOCKS = { ON | OFF }
    | OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
    | IGNORE_DUP_KEY = { ON | OFF }
    | STATISTICS_NORECOMPUTE = { ON | OFF }
    | COMPRESSION_DELAY = { 0 | delay [ Minutes ] }
}

<resumable_index_option> ::=
 {
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION = <time> [ MINUTES ]
    | <low_priority_lock_wait>
 }

<low_priority_lock_wait> ::=
{
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )
}

Sintassi per Azure Synapse Analytics and Analytics Platform System (PDW).

ALTER INDEX { index_name | ALL }
    ON [ schema_name. ] table_name
{
      REBUILD {
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ]
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) ] ]
      }
    | DISABLE
    | REORGANIZE [ PARTITION = partition_number ]
}
[ ; ]

<rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
    | XML_COMPRESSION = { ON | OFF }
        [ ON PARTITIONS ( { <partition_number> [ TO <partition_number> ] } [ , ...n ] ) ]
}

<single_partition_rebuild_index_option> ::=
{
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
    | XML_COMPRESSION = { ON | OFF }
}

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.

Argomenti

index_name

Nome dell'indice. I nomi di indice devono essere univoci all'interno di una tabella o di una vista, ma non all'interno di un database. Devono essere anche conformi alle regole degli identificatori.

ALL

Specifica tutti gli indici associati alla tabella o alla vista indipendentemente dal tipo di indice. ALL Se si specifica, l'istruzione non riesce se uno o più indici si trovano in un filegroup offline o di sola lettura o se l'operazione specificata non è consentita in uno o più tipi di indice. Nella tabella seguente vengono elencati le operazioni sugli indici e i tipi di indice non supportati.

Uso della parola chiave ALL con questa operazione Indici non supportati (l'istruzione ha esito negativo se la tabella include uno o più di questi indici)
REBUILD WITH ONLINE = ON Indice XML

Indice spaziale

Indice columnstore 1
REBUILD PARTITION = <partition_number> Indice non partizionato, indice XML, indice spaziale o indice disabilitato
REORGANIZE Indici con ALLOW_PAGE_LOCKS impostato su OFF
REORGANIZE PARTITION = <partition_number> Indice non partizionato, indice XML, indice spaziale o indice disabilitato
IGNORE_DUP_KEY = ON Indice XML

Indice spaziale

Indice columnstore 1
ONLINE = ON Indice XML

Indice spaziale
Indice columnstore 1
RESUMABLE = ON2 Indici ripristinabili non supportati con ALL la parola chiave

1 Si applica a SQL Server 2012 (11.x) e versioni successive e database SQL di Azure.

2 Si applica a SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Se ALL viene specificato con PARTITION = <partition_number>, tutti gli indici devono essere allineati. il che significa che devono essere partizionati in base a funzioni di partizione equivalenti. L'uso di ALL con PARTITION determina la ricompilazione o la riorganizzazione di tutte le partizioni di indice con lo stesso <partition_number> . Per altre informazioni sugli indici partizionati, vedere Tabelle e indici partizionati.

Per informazioni più dettagliate sulle operazioni sugli indici che possono essere eseguite online, vedere Linee guida per le operazioni sugli indici online.

database_name

Nome del database.

schema_name

Nome dello schema a cui appartiene la tabella o la vista.

table_or_view_name

Nome della tabella o della vista associata all'indice. Per visualizzare un report degli indici di un oggetto, usare la vista del catalogo sys.indexes.

database SQL supporta il formato <database_name>.[schema_name].<table_or_view_name> del nome in tre parti quando il database_name è il database corrente o il database_name è tempdb e il table_or_view_name inizia con #.

REBUILD [ WITH ( <rebuild_index_option> [ ,... n ] ) ] ]

Si applica a: SQL Server 2012 (11.x) e versioni successive e database SQL di Azure

Specifica che l'indice viene ricompilato utilizzando le stesse colonne, tipo di indice, attributo di univocità e ordinamento. Questa clausola equivale a DBCC DBREINDEX. REBUILD abilita un indice disabilitato. La ricompilazione di un indice cluster non ricompila gli indici non cluster associati a meno che non venga specificata la parola chiave ALL . Se non vengono specificate opzioni di indice, vengono applicati i valori esistenti delle opzioni di indice archiviati in sys.indexes. Per le opzioni di indice il cui valore non è archiviato in sys.indexes, viene applicato il valore predefinito indicato nella definizione dell'argomento dell'opzione.

Se ALL viene specificato e la tabella sottostante è un heap, l'operazione REBUILD non ha alcun effetto sulla tabella. Vengono ricompilati tutti gli indici non cluster associati alla tabella.

L'operazione REBUILD può essere sottoposta a registrazione minima se viene usato il modello di recupero del database con registrazione minima o con registrazione minima delle operazioni bulk.

Nota

Quando si ricompila un indice XML primario, la tabella utente sottostante non è disponibile per tutta la durata dell'operazione sull'indice.

Per gli indici columnstore, l'operazione REBUILD:

  • Non usa l'ordinamento.
  • Acquisisce un blocco esclusivo sulla tabella o partizione durante l'operazione REBUILD. I dati sono "offline" e non sono disponibili durante , REBUILDanche quando si usa NOLOCK, l'isolamento dello snapshot read committed (RCSI) o l'isolamento dello snapshot (SI).
  • Ricomprime tutti i dati nel columnstore. Durante l'operazione REBUILD, esistono due copie dell'indice columnstore. Al termine dell'operazione REBUILD, SQL Server elimina l'indice columnstore originale.

Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

PARTITION

Specifica che viene ricompilata o riorganizzata una sola partizione di un indice. PARTITION non può essere specificato se index_name non è un indice partizionato.

PARTITION = ALL ricompila tutte le partizioni.

Avviso

La creazione e la ricompilazione di indici non allineati in una tabella con più di 1.000 partizioni è possibile, ma non è supportata. Questa operazione potrebbe causare prestazioni ridotte o un consumo eccessivo di memoria durante queste operazioni. Quando il numero di partizioni supera 1000, Microsoft consiglia di usare solo indici allineati.

  • partition_number

    Numero di partizioni di un indice partizionato da ricompilare o riorganizzare. partition_number è un'espressione costante che può fare riferimento a variabili, incluse variabili o funzioni con tipo definito dall'utente (UDT) e funzioni definite dall'utente, ma non a istruzioni Transact-SQL. È necessario che partition_number esista o l'istruzione avrà esito negativo.

  • WITH ( <single_partition_rebuild_index_option> )

    SORT_IN_TEMPDB, MAXDOP, DATA_COMPRESSION e XML_COMPRESSION sono le opzioni che è possibile specificare quando si esegue l'operazione REBUILD su una singola partizione (PARTITION = partition_number). Non è possibile specificare indici XML in un'operazione REBUILD su una singola partizione.

DISABLE

Contrassegna l'indice come disabilitato e non disponibile per l'uso da parte del motore di database. È possibile disabilitare qualsiasi indice. La definizione di un indice disabilitato rimane nel catalogo di sistema senza i dati dell'indice sottostante. La disabilitazione di un indice cluster impedisce all'utente di accedere ai dati della tabella sottostante. Per abilitare un indice, usare ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING. Per altre informazioni, vedere Disabilitare indici e vincoli e Abilitare indici e vincoli.

Operazione REORGANIZE per un indice rowstore

Per gli indici rowstore, REORGANIZE specifica di riorganizzare il livello foglia dell'indice. L'operazione REORGANIZE è:

  • Viene eseguita sempre online. Ciò significa che i blocchi di tabella a lungo termine non vengono mantenuti e le query o gli aggiornamenti sulla tabella sottostante possono continuare durante la transazione ALTER INDEX REORGANIZE.
  • Non è consentita per un indice disabilitato.
  • Non consentito quando ALLOW_PAGE_LOCKS è impostato su OFF.
  • Non eseguito il rollback quando viene eseguito all'interno di una transazione e viene eseguito il rollback della transazione.

Nota

Quando ALTER INDEX REORGANIZE usa transazioni esplicite, ad esempio ALTER INDEX all'interno di BEGIN TRAN ... COMMIT/ROLLBACK, anziché la modalità di transazione implicita, il comportamento di blocco di REORGANIZE diventa più restrittivo, causando potenzialmente il blocco. Per altre informazioni sulle transazioni implicite, vedere edizione Standard T IMPLICIT_TRANSACTIONS.

Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

REORGANIZE WITH ( LOB_COMPACTION = { ON | OFF } )

Si applica agli indici rowstore.

LOB_COMPACTION = ON

  • Specifica di comprimere tutte le pagine che contengono dati di questi tipi di dati LOB: image, text, ntext, varchar(max), nvarchar(max), varbinary(max) e xml. Con la compattazione di questi dati, è possibile ridurre le dimensioni dei dati su disco.
  • Per un indice cluster, vengono compattate tutte le colonne LOB contenute nella tabella.
  • Per un indice non cluster, vengono compattate tutte le colonne LOB che sono colonne non chiave (incluse) nell'indice.
  • REORGANIZE ALL esegue LOB_COMPACTION su tutti gli indici. Per ogni indice, vengono compattate tutte le colonne LOB nell'indice cluster, nella tabella sottostante o le colonne incluse in un indice non cluster.

LOB_COMPACTION = OFF

  • Le pagine contenenti dati LOB non vengono compresse.
  • OFF non ha alcun effetto su un heap.

Operazione REORGANIZE per un indice columnstore

Per gli indici columnstore, REORGANIZE comprime ogni CLOSED rowgroup differenziale nel columnstore come rowgroup compresso. L'operazione REORGANIZE viene sempre eseguita online. Ciò significa che i blocchi di tabella a lungo termine non vengono mantenuti e le query o gli aggiornamenti sulla tabella sottostante possono continuare durante la transazione ALTER INDEX REORGANIZE. Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

  • REORGANIZE non è necessario per spostare i CLOSED rowgroup differenziali in rowgroup compressi. Il processo di tupla in background viene riattivato periodicamente per comprimere CLOSED i rowgroup differenziali. È consigliabile usare REORGANIZE quando il tuple-mover è in ritardo. REORGANIZE può comprimere i rowgroup in modo più aggressivo.
  • Per comprimere tutti i OPEN rowgroup e CLOSED , vedere l'opzione REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS) in questa sezione.

Per gli indici columnstore in SQL Server (a partire da SQL Server 2016 (13.x)) e database SQL di Azure, REORGANIZE esegue online le ottimizzazioni di deframmentazione aggiuntive seguenti:

  • Rimuove fisicamente le righe da un rowgroup quando più del 10% delle righe è stato eliminato in modo logico. I byte eliminati vengono recuperati sui supporti fisici. Ad esempio, se un gruppo di righe compresso di 1 milione di righe ha 100.000 righe eliminate, SQL Server rimuove le righe eliminate e ricomprime il rowgroup con 900.000 righe. Esegue il salvataggio nell'archiviazione rimuovendo le righe eliminate.

  • Combina uno o più rowgroup compressi per aumentare le righe in ogni rowgroup, fino a un massimo di 1.048.576 righe. Ad esempio, se si importano in blocco 5 batch di 102.400 righe, si ottengono 5 rowgroup compressi. Se si esegue REORGANIZE, questi rowgroup vengono uniti in 1 rowgroup compresso di dimensioni pari a 512.000 righe. Si presuppone che non vi siano limiti di memoria o di dimensioni del dizionario.

  • Per i rowgroup in cui il 10% o più righe sono state eliminate logicamente, SQL Server tenta di combinare questo rowgroup con uno o più rowgroup. Ad esempio, il rowgroup 1 viene compresso con 500.000 righe e il rowgroup 21 viene compresso con il numero massimo di 1.048.576 righe. Nel rowgroup 21 il 60% delle righe è stato eliminato in modo da lasciare 409.830 righe. SQL Server consente di combinare questi due rowgroup per comprimere un nuovo rowgroup con 909.830 righe.

REORGANIZE WITH ( COMPRESS_ALL_ROW_GROUPS = { ON | OFF } )

Si applica agli indici columnstore.

Si applica a: SQL Server, a partire da SQL Server 2016 (13.x), e database SQL di Azure

COMPRESS_ALL_ROW_GROUPSconsente di forzare o CLOSED delta OPEN rowgroup nel columnstore. Con questa opzione, non è necessario ricompilare l'indice columnstore per svuotare i rowgroup differenziali. Grazie a questa opzione e ad altre funzionalità di deframmentazione per la rimozione e l'unione, nella maggior parte dei casi non è più necessario ricompilare l'indice.

  • ON forza tutti i rowgroup nel columnstore, indipendentemente dalle dimensioni e dallo stato (CLOSED o OPEN).
  • OFF forza tutti i CLOSED rowgroup nel columnstore.

Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

edizione Standard T ( <opzione> set_index [ ,... n ] )

Specifica alcune opzioni per l'indice senza ricompilare né riorganizzare l'indice. SET non può essere specificato per un indice disabilitato.

PAD_INDEX = { ON | OFF }

Specifica il riempimento dell'indice. Il valore predefinito è OFF.

  • In...

    La percentuale di spazio disponibile specificata da FILLFACTOR viene applicata alle pagine di livello intermedio dell'indice. Se FILLFACTOR non viene specificato contemporaneamente PAD_INDEX è impostato su ON, viene usato il valore del fattore di riempimento archiviato in sys.indexes .

  • OFF o fillfactor non è specificato

    Le pagine di livello intermedio vengono riempite poco al di sotto della capacità massima. Lo spazio residuo è sufficiente per almeno una riga della dimensione massima supportata dall'indice, in base al set di chiavi nelle pagine intermedie.

Per altre informazioni, vedere CREATE INDEX.

FILLFACTOR = fillfactor

Specifica una percentuale che indica quanto deve essere riempito il livello foglia di ogni pagina di indice dal motore di database durante la creazione o la modifica dell'indice. fillfactor deve essere un valore intero compreso tra 1 e 100. Il valore predefinito è 0. I valori 0 e 100 relativi al fattore di riempimento sono equivalenti.

Un'impostazione esplicita di FILLFACTOR viene applicata solo quando l'indice viene creato per la prima volta o ricompilato. La percentuale specificata di spazio vuoto delle pagine non viene mantenuta in modo dinamico dal motore di database. Per altre informazioni, vedere CREATE INDEX.

Per visualizzare l'impostazione del fattore di riempimento. usare fill_factor in sys.indexes.

Importante

La creazione o la modifica di un indice cluster con un valore FILLFACTOR influisce sulla quantità di spazio di archiviazione occupata dai dati, perché i dati vengono ridistribuiti dal motore di database durante la creazione dell'indice cluster.

SORT_IN_TEMPDB = { ON | OFF }

Specifica se archiviare i risultati dell'ordinamento in tempdb. Il valore predefinito è OFF ad eccezione di database SQL di Azure Hyperscale. Per tutte le operazioni di ricompilazione dell'indice in Hyperscale, SORT_IN_TEMPDB è sempre ON, indipendentemente dall'opzione specificata, a meno che non venga usata la ricompilazione dell'indice ripristinabile.

  • In...

    I risultati di ordinamento intermedi usati per compilare l'indice vengono archiviati in tempdb. Se tempdb si trova in un set di dischi diverso rispetto al database utente, questo potrebbe ridurre il tempo necessario per creare un indice. 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.

Se non è necessario eseguire un'operazione di ordinamento o se l'ordinamento può essere eseguito in memoria, l'opzione SORT_IN_TEMPDB viene ignorata.

Per altre informazioni, vedere Opzione SORT_IN_TEMPDB per gli indici.

IGNORE_DUP_KEY = { ON | OFF }

Specifica l'errore restituito quando un'operazione di inserimento tenta di inserire valori di chiave duplicati in un indice univoco. L'opzione IGNORE_DUP_KEY viene applicata solo alle operazioni di inserimento eseguite dopo la creazione o la ricompilazione dell'indice. Il valore predefinito è OFF.

  • In...

    Viene visualizzato un messaggio di avviso quando in un indice univoco vengono inseriti valori chiave duplicati. Solo le righe che violano il vincolo di univocità hanno esito negativo.

  • OFF

    Viene visualizzato un messaggio di errore quando in un indice univoco vengono inseriti valori chiave duplicati. Viene eseguito il rollback dell'intera INSERT operazione.

IGNORE_DUP_KEY non può essere impostato su ON per gli indici creati in una vista, indici non univoci, indici XML, indici spaziali e indici filtrati.

Per visualizzare IGNORE_DUP_KEY, usare sys.indexes.

Nella sintassi compatibile con le versioni precedenti WITH IGNORE_DUP_KEY equivale a WITH IGNORE_DUP_KEY = ON.

STATISTICS_NORECOMPUTE = { ON | OFF }

Disabilitare o abilitare l'opzione di aggiornamento automatico delle statistiche, AUTO_STATISTICS_UPDATE, per le statistiche correlate agli indici specificati. Il valore predefinito è OFF.

  • In...

    Gli aggiornamenti automatici delle statistiche vengono disabilitati dopo la ricompilazione dell'indice.

  • OFF

    Gli aggiornamenti automatici delle statistiche vengono abilitati dopo la ricompilazione dell'indice.

Per ripristinare l'aggiornamento automatico delle statistiche, impostare su STATISTICS_NORECOMPUTEOFFo eseguire UPDATE STATISTICS senza la NORECOMPUTE clausola .

Avviso

Se si disabilita l'aggiornamento automatico delle statistiche, è possibile impedire a Query Optimizer di scegliere piani di esecuzione ottimali per le query che coinvolgono la tabella. È consigliabile usare questa opzione con moderazione e solo da un amministratore di database qualificato.

Questa impostazione non impedisce un aggiornamento automatico con analisi completa delle statistiche correlate all'indice durante l'operazione di ricompilazione.

STATISTICS_INCREMENTAL = { ON | OFF }

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

Quando ON, le statistiche create sono per statistiche di partizione. Quando OFF, l'albero delle statistiche viene eliminato e SQL Server ricompila le statistiche. Il valore predefinito è OFF.

Se le statistiche per partizione non sono supportate, l'opzione viene ignorata e viene generato un avviso. Le statistiche incrementali non sono supportate per i tipi di statistiche seguenti:

  • Statistiche create con indici il cui partizionamento non è allineato con la tabella di base
  • Statistiche create per i database di replica secondaria leggibile del gruppo di disponibilità
  • Statistiche create per i database di sola lettura
  • Statistiche create per gli indici filtrati
  • Statistiche create per le viste
  • Statistiche create per le tabelle interne
  • Statistiche create con indici spaziali o indici XML

ONLINE = { ON | OFF } <come si applica a rebuild_index_option>

Specifica se le tabelle sottostanti e gli indici associati sono disponibili per le query e la modifica dei dati durante l'operazione sugli indici. Il valore predefinito è OFF.

Per un indice XML o un indice spaziale, è supportato solo ONLINE = OFF e se ONLINE è impostato su ON un errore.

Importante

Le operazioni online sugli indici non sono disponibili in tutte le edizioni di Microsoft SQL Server. Per un elenco delle funzionalità supportate dalle varie edizioni di SQL Server, vedere Edizioni e funzionalità supportate di SQL Server 2022.

  • In...

    I blocchi di tabella a lungo termine non vengono mantenuti durante l'operazione sull'indice. Durante la fase principale dell'operazione viene mantenuto solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine. In questo modo, le query o gli aggiornamenti relativi alla tabella e agli indici sottostanti possono continuare. All'inizio dell'operazione, un blocco Condiviso (S) viene brevemente mantenuto sull'oggetto di origine. Al termine dell'operazione, un blocco S viene brevemente mantenuto sull'origine se viene creato un indice non cluster. Un blocco di modifica dello schema (Sch-M) viene acquisito quando un indice cluster viene creato o eliminato online e quando viene ricompilato un indice cluster o non cluster. ONLINE non può essere impostato su ON quando viene creato un indice in una tabella temporanea locale.

  • OFF

    I blocchi di tabella vengono applicati durante l'operazione sull'indice. Un'operazione sull'indice offline che crea, ricompila o elimina un indice cluster, spaziale o XML oppure che ricompila o elimina un indice non cluster, acquisisce un blocco di modifica dello schema (SCH-M) sulla tabella. Il blocco impedisce a tutti gli utenti di accedere alla tabella sottostante durante l'operazione. Un'operazione sugli indici offline che crea un indice non cluster acquisisce un blocco condiviso (S) sulla tabella. Ciò impedisce gli aggiornamenti alla tabella sottostante, ma consente operazioni di lettura, ad esempio SELECT istruzioni.

Per altre informazioni, vedere Eseguire operazioni sugli indici online.

È possibile ricompilare online tutti gli indici, inclusi quelli di tabelle temporanee globali, ad eccezione dei casi seguenti:

  • Indice XML
  • Indice di una tabella temporanea locale
  • Indice cluster univoco iniziale su una vista
  • Indici columnstore
  • Indice cluster, se la tabella sottostante contiene tipi di dati LOB (image, ntext, text) e tipi spaziali
  • Le colonne varchar(max) e varbinary(max) non possono fare parte di un indice. In SQL Server, a partire da SQL Server 2012 (11.x), e nel database SQL di Azure quando una tabella contiene colonne varchar(max) o varbinary(max), è possibile compilare o ricompilare un indice cluster contenente altre colonne usando l'opzione ONLINE. Il database SQL di Azure non consente l'opzione ONLINE quando la tabella di base contiene colonne varchar(max) o varbinary(max)

Per altre informazioni, vedere Funzionamento delle operazioni sugli indici online.

I seguenti eventi XEvent sono correlati alla ricompilazione dell'indice ALTER TABLE ... SWITCH PARTITION online e .

  • lock_request_priority_state
  • process_killed_by_abort_blockers
  • ddl_with_wait_at_low_priority

L'evento XEvent progress_report_online_index_operation esistente per le operazioni sugli indici online include partition_number e partition_id.

RESUMABLE = { ON | OFF}

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Specifica se un'operazione sull'indice online è ripristinabile.

  • In...

    L'operazione sull'indice è ripristinabile.

  • OFF

    L'operazione sull'indice non è ripristinabile.

MAX_DURATION = tempo [ MINUTES ] usato con RESUMABLE = ON (richiede ONLINE = ON)

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Indica il tempo (un valore intero specificato in minuti) di esecuzione di un'operazione sull'indice online ripristinabile prima di essere sospesa.

Importante

Per informazioni più dettagliate sulle operazioni sugli indici che possono essere eseguite online, vedere Linee guida per le operazioni sugli indici online.

Nota

Le ricompilazione degli indici online ripristinabili non sono supportate per gli indici columnstore.

ALLOW_ROW_LOCKS = { ON | OFF }

Specifica se sono consentiti blocchi di riga. Il valore predefinito è ON.

  • In...

    I blocchi di riga sono consentiti durante l'accesso all'indice. Il motore di database determina quando usare i blocchi di riga.

  • OFF

    I blocchi di riga non vengono usati.

ALLOW_PAGE_LOCKS = { ON | OFF }

Specifica se sono consentiti blocchi a livello di pagina. Il valore predefinito è ON.

  • In...

    I blocchi a livello di pagina sono consentiti durante l'accesso all'indice. Il motore di database determina quando usare i blocchi di pagina.

  • OFF

    I blocchi di pagina non vengono usati.

Nota

Non è possibile riorganizzare un indice quando ALLOW_PAGE_LOCKS è impostato su OFF.

OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }

Si applica a: SQL Server 2019 (15.x) e versioni successive e database SQL di Azure

Specifica se eseguire o meno l'ottimizzazione per la contesa di inserimento dell'ultima pagina. Il valore predefinito è OFF. Per altre informazioni, vedere Chiavi sequenziali.

MAXDOP = max_degree_of_parallelism

Sostituisce l'opzione di configurazione Massimo grado di parallelismo durante l'operazione sull'indice. Per altre informazioni, vedere Configurare il massimo grado di parallelismo (opzione di configurazione del server). Usare MAXDOP per limitare il numero di processori usati in un'esecuzione di piano parallela. Il valore massimo è 64 processori.

Importante

Sebbene l'opzione MAXDOP sia sintatticamente supportata per tutti gli indici XML, per un indice spaziale o un indice XML primario, ALTER INDEX attualmente usa solo un singolo processore.

max_degree_of_parallelism può essere:

  • 1: elimina la generazione di piani paralleli.
  • >1: limita il numero massimo di processori utilizzati in un'operazione di indice parallelo al numero specificato.
  • 0 (impostazione predefinita): usa il numero effettivo di processori o meno in base al carico di lavoro del sistema corrente.

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

Nota

Le operazioni parallele sugli indici non sono disponibili in tutte le edizioni di SQL Server. Per un elenco delle funzionalità supportate dalle varie edizioni di SQL Server, vedere Edizioni e funzionalità supportate di SQL Server 2017.

COMPRESSION_DELAY = { 0 | duration [ minutes ] }

Si applica a: SQL Server, a partire da SQL Server 2016 (13.x)

Per una tabella basata su disco, il ritardo specifica il numero minimo di minuti in cui un rowgroup differenziale nello CLOSED stato deve rimanere nel rowgroup differenziale prima che SQL Server possa comprimerlo nel rowgroup compresso. Poiché le tabelle basate su disco non tengono traccia dei tempi di inserimento e aggiornamento in singole righe, SQL Server applica il ritardo ai rowgroup differenziali nello CLOSED stato.

Il valore predefinito è 0 minuti.

Per consigli su quando usare COMPRESSION_DELAY, vedere Introduzione a Columnstore per l'analisi operativa in tempo reale.

DATA_COMPRESSION

Specifica l'opzione di compressione dei dati per l'indice, il numero di partizione o l'intervallo di partizioni specificato. Le opzioni sono le seguenti:

  • NONE

    L'indice o le partizioni specificate non vengono compressi. Non si applica agli indici columnstore.

  • ROW

    L'indice o le partizioni specificate vengono compressi utilizzando la compressione di riga. Non si applica agli indici columnstore.

  • PAGE

    L'indice o le partizioni specificate vengono compressi utilizzando la compressione di pagina. Non si applica agli indici columnstore.

  • COLUMNSTORE

    Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

    Si applica solo agli indici columnstore, inclusi gli indici columnstore cluster e quelli non cluster. COLUMNSTORE specifica di decomprimere l'indice o le partizioni specificate compresse con l'opzione COLUMNSTORE_ARCHIVE . Quando i dati vengono ripristinati, continuano a essere compressi con la compressione columnstore usata per tutti gli indici columnstore.

  • COLUMNSTORE_ARCHIVE

    Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

    Si applica solo agli indici columnstore, inclusi gli indici columnstore cluster e quelli non cluster. COLUMNSTORE_ARCHIVE comprime ulteriormente la partizione specificata in una dimensione inferiore. Può essere utilizzata per l'archiviazione o in altre situazioni in cui sono richieste dimensioni di archiviazione inferiori ed è possibile concedere più tempo per l'archiviazione e il recupero.

Per altre informazioni sulla compressione, vedere Compressione dei dati.

XML_COMPRESSION

Si applica a: SQL Server 2022 (16.x) e versioni successive Database SQL di Azure e Istanza gestita di SQL di Azure

Specifica l'opzione di compressione XML per l'indice specificato che contiene una o più colonne del tipo di dati xml. Le opzioni sono le seguenti:

  • In...

    L'indice o le partizioni specificate vengono compressi usando la compressione XML.

  • OFF

    L'indice o le partizioni specificate non vengono compressi.

ON PARTITIONS ( { <partition_number_expression> | <range> } [ ,... n ] )

Specifica le partizioni a cui si applicano le impostazioni DATA_COMPRESSION o XML_COMPRESSION. Se l'indice non è partizionato, l'argomento ON PARTITIONS genera un errore. Se la clausola ON PARTITIONS non viene specificata, l'opzione DATA_COMPRESSION o XML_COMPRESSION verrà applicata a tutte le partizioni di un indice partizionato.

<partition_number_expression> può essere specificato nei modi seguenti:

  • Specificare il numero di una partizione, ad esempio: ON PARTITIONS (2).

  • Specificare i numeri di partizione per più partizioni singole separati da virgole, ad esempio: ON PARTITIONS (1, 5).

  • Specificare sia intervalli che partizioni singole: ON PARTITIONS (2, 4, 6 TO 8).

È possibile specificare <range> sotto forma di numeri di partizione separati dalla parola TO, ad esempio: ON PARTITIONS (6 TO 8).

Per impostare tipi diversi di compressione dei dati per partizioni diverse, specificare più volte l'opzione DATA_COMPRESSION, ad esempio:

REBUILD WITH
(
DATA_COMPRESSION = NONE ON PARTITIONS (1),
DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8),
DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5)
);

È anche possibile specificare più volte l'opzione XML_COMPRESSION, ad esempio:

REBUILD WITH
(
  XML_COMPRESSION = OFF ON PARTITIONS (1),
  XML_COMPRESSION = ON ON PARTITIONS (2, 4, 6 TO 8),
  XML_COMPRESSION = OFF ON PARTITIONS (3, 5)
);

ONLINE = { ON | OFF } <come si applica a single_partition_rebuild_index_option>

Specifica se un indice o una partizione di indice di una tabella sottostante può essere ricompilata online o offline. Se si esegue REBUILD ... ONLINE = ON, i dati in questa tabella sono disponibili per le query e la modifica dei dati durante l'operazione sull'indice. Il valore predefinito è OFF.

  • In...

    I blocchi di tabella a lungo termine non vengono mantenuti durante l'operazione sull'indice. Durante la fase principale dell'operazione viene mantenuto solo un blocco preventivo condiviso (IS, Intent Shared) sulla tabella di origine. Quando si avvia la ricompilazione dell'indice, è necessario un blocco di stabilità dello schema (Sch-S) sulla tabella, mentre è necessario un blocco di modifica dello schema (Sch-M) sulla tabella alla fine della ricompilazione dell'indice online. Sebbene entrambi i blocchi di metadati siano di breve durata, soprattutto il blocco Sch-M deve attendere il completamento di tutte le transazioni bloccanti. Durante il tempo di attesa, il blocco Sch-M impedisce tutte le altre transazioni in attesa dovute a questo blocco in caso di accesso alla stessa tabella.

    Nota

    La ricompilazione di indici online può impostare le opzioni low_priority_lock_wait; vedere WAIT_AT_LOW_PRIORITY con operazioni sugli indici online.

  • OFF

    I blocchi di tabella vengono applicati durante l'operazione sull'indice. Il blocco impedisce a tutti gli utenti di accedere alla tabella sottostante durante l'operazione.

RESUME

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Riprende un'operazione sull'indice che è stata sospesa manualmente o a causa di un errore.

  • MAX_DURATION usato con RESUMABLE = ON

    Tempo (un valore intero espresso in minuti) di esecuzione di un'operazione sull'indice online ripristinabile dopo il ripristino. Allo scadere del tempo, l'operazione ripristinabile viene sospesa se è ancora in esecuzione.

  • WAIT_AT_LOW_PRIORITY usato con RESUMABLE = ON e ONLINE = ON.

    Per una ricompilazione di indice online dopo una sospensione è necessario attendere il blocco delle operazioni su questa tabella. WAIT_AT_LOW_PRIORITY indica che l'operazione di ricompilazione dell'indice online attende blocchi con priorità bassa, consentendo ad altre operazioni di continuare mentre l'operazione di compilazione dell'indice online è in attesa. L'omissione dell'opzione WAIT_AT_LOW_PRIORITY equivale a WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE). Per altre informazioni, vedere WAIT_AT_LOW_PRIORITY.

PAUSE

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Sospende un'operazione di ricompilazione dell'indice online ripristinabile.

ABORT

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Interrompe un'operazione sull'indice in esecuzione o sospesa, dichiarata ripristinabile. È necessario eseguire in modo esplicito un comando ABORT per terminare un'operazione di ricompilazione dell'indice ripristinabile. L'errore o la sospensione di un'operazione sull'indice ripristinabile non ne termina l'esecuzione, ma lascia l'operazione in uno stato di sospensione indefinito.

Osservazioni:

Non è possibile usare ALTER INDEX per ripartizionare un indice o spostarlo in un filegroup diverso, né per modificare la definizione dell'indice, ad esempio per aggiungere o eliminare colonne oppure per modificarne l'ordine. Per eseguire queste operazioni usare CREATE INDEX con la clausola DROP_EXISTING.

Quando un'opzione non viene specificata in modo esplicito, viene applicata l'impostazione corrente. Ad esempio, se un'impostazione FILLFACTOR non viene specificata nella REBUILD clausola , il valore del fattore di riempimento archiviato nel catalogo di sistema viene usato durante il processo di ricompilazione. Per visualizzare le impostazioni correnti delle opzioni per gli indici, usare sys.indexes.

I valori per ONLINE, MAXDOP e SORT_IN_TEMPDB non vengono archiviati nel catalogo di sistema. Se non viene specificato un valore nell'istruzione dell'indice, viene utilizzato il valore predefinito dell'opzione.

Nei computer multiprocessore l'istruzione ALTER INDEX REBUILD usa automaticamente più processori per eseguire le operazioni di analisi e ordinamento associate alla modifica dell'indice, in modo identico ad altre query. Quando si esegue ALTER INDEX REORGANIZE, con o senza LOB_COMPACTION, il valore di max degree of parallelism corrisponde a un'operazione a thread singolo. Per altre informazioni, vedere Configurazione di operazioni parallele sugli indici.

Importante

Non è possibile riorganizzare o ricompilare un indice se il filegroup in cui si trova è offline o impostato su sola lettura. Quando viene specificata la parola chiave ALL e uno o più indici si trovano in un filegroup offline o di sola lettura, l'istruzione ha esito negativo.

Ricompilazione degli indici

La ricompilazione di un indice consiste nell'eliminazione e nella ricreazione dell'indice. Questa operazione consente di rimuovere la frammentazione, rendere disponibile spazio su disco grazie alla compattazione delle pagine in base all'impostazione del fattore di riempimento esistente o specificata e riordinare le righe dell'indice in pagine contigue. Quando viene specificata la parola chiave ALL, tutti gli indici della tabella vengono eliminati e ricompilati in una singola transazione. Non è necessario eliminare in anticipo i vincoli di chiave esterna. Quando vengono ricompilati indici con 128 o più extent, il motore di database posticipa le effettive deallocazioni delle pagine e i blocchi associati fino al termine del commit della transazione.

Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

Riorganizzare gli indici

La riorganizzazione di un indice richiede una quantità minima di risorse di sistema. Questa operazione deframmenta il livello foglia di indici cluster e non cluster di tabelle e viste tramite il riordinamento fisico delle pagine al livello foglia in base all'ordine logico, da sinistra verso destra, dei nodi foglia. La riorganizzazione consente inoltre di compattare le pagine di indice in base al valore del fattore di riempimento esistente.

Quando viene specificato ALL, vengono riorganizzati gli indici relazionali, sia cluster sia non cluster, e gli indici XML della tabella. Quando si specifica ALL, vengono applicate alcune restrizioni. Vedere la definizione di ALL nella sezione Argomenti di questo articolo.

Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.

Importante

Per una tabella di Azure Synapse Analytics con un indice columnstore cluster ordinato, ALTER INDEX REORGANIZE non riordina i dati. Per riordinare i dati, usare ALTER INDEX REBUILD.

Disabilitare gli indici

La disabilitazione di un indice impedisce agli utenti di accedere all'indice e, nel caso di indici cluster, ai dati della tabella sottostante. La definizione dell'indice rimane archiviata nel catalogo di sistema. La disabilitazione di un indice non cluster o di un indice cluster di una vista elimina fisicamente i dati dell'indice. La disabilitazione di un indice cluster impedisce l'accesso ai dati, i quali tuttavia rimangono archiviati in forma non gestita nell'albero B fino all'eliminazione o alla ricompilazione dell'indice. Per visualizzare lo stato di un indice abilitato o disabilitato, eseguire una query sulla is_disabled colonna nella vista del sys.indexes catalogo.

Nota

Nella documentazione di SQL Server viene usato in modo generico il termine albero B in riferimento agli indici. Negli indici rowstore, SQL Server implementa un albero B+. Ciò non si applica a indici columnstore o ad archivi dati in memoria. Per altre informazioni, vedere Architettura e guida per la progettazione degli indici SQL Server e Azure SQL.

Se una tabella è inclusa in una pubblicazione per la replica transazionale, non è possibile disabilitare gli indici associati a colonne chiave primaria. Questi indici sono necessari per la replica. Per disabilitare un indice, è innanzitutto necessario eliminare la tabella dalla pubblicazione. Per altre informazioni, vedere Pubblicare dati e oggetti di database.

Per abilitare l'indice, usare l'istruzione ALTER INDEX REBUILD o CREATE INDEX WITH DROP_EXISTING. La ricompilazione di un indice cluster disabilitato non può essere eseguita con l'opzione ONLINE impostata su ON. Per altre informazioni, vedere Disabilitare indici e vincoli.

Impostare le opzioni

È possibile impostare le opzioni ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, OPTIMIZE_FOR_SEQUENTIAL_KEY, IGNORE_DUP_KEYe STATISTICS_NORECOMPUTE per un indice specificato senza ricompilare o riorganizzare tale indice. I valori modificati vengono applicati immediatamente all'indice. Per visualizzare queste impostazioni, usare sys.indexes. Per altre informazioni vedere Impostare le opzioni di indice.

Opzioni per blocchi di riga e di pagina

Se ALLOW_ROW_LOCKS = ON e ALLOW_PAGE_LOCK = ON, sono consentiti blocchi a livello di riga, pagina e tabella quando si accede all'indice. Il motore di database sceglie il blocco appropriato e può eseguire un'escalation del blocco da un blocco di riga o di pagina a un blocco di tabella.

Se ALLOW_ROW_LOCKS = OFF e ALLOW_PAGE_LOCK = OFF, è consentito solo un blocco a livello di tabella quando si accede all'indice.

Se si specifica ALL al momento dell'impostazione delle opzioni di blocco di riga o pagina, le impostazioni vengono applicate a tutti gli indici. Se la tabella sottostante è un heap, le impostazioni vengono applicate nei modi seguenti:

Opzione Dettagli
ALLOW_ROW_LOCKS = ON or OFF Viene applicata all'heap e a tutti gli indici non cluster associati.
ALLOW_PAGE_LOCKS = ON Viene applicata all'heap e a tutti gli indici non cluster associati.
ALLOW_PAGE_LOCKS = OFF Viene applicata agli indici non cluster. Ciò significa che negli indici non cluster non è consentito alcun blocco a livello di pagina. Nell'heap non sono consentiti solo i blocchi condivisi (S), di aggiornamento (U) ed esclusivi (X) per la pagina. Il motore di database può comunque acquisire un blocco preventivo a livello di pagina (IS, IU o IX) per scopi interni.

Operazioni online sugli indici

Quando si ricompila un indice e l'opzione ONLINE è impostata su ON, gli oggetti sottostanti, le tabelle e gli indici associati, sono disponibili per le query e la modifica dei dati. È inoltre possibile ricompilare online una parte di indice che risiede in una singola partizione. I blocchi di tabella esclusivi vengono mantenuti solo per un breve periodo di tempo durante il processo di modifica.

La riorganizzazione di un indice viene sempre eseguita online. Questo processo non mantiene i blocchi a lungo termine e di conseguenza non blocca le query o gli aggiornamenti in corso.

È possibile eseguire operazioni simultanee sugli indici online nella stessa tabella o partizione di tabella solo quando si eseguono le operazioni seguenti:

  • Creazione di più indici non cluster.
  • Riorganizzazione di indici diversi della stessa tabella.
  • Riorganizzazione di indici diversi durante la ricompilazione di indici non sovrapposti della stessa tabella.

Qualsiasi altra operazione sugli indici online eseguita nello stesso istante avrà esito negativo. Ad esempio, non è possibile ricompilare due o più indici nella stessa tabella simultaneamente né creare un nuovo indice durante la ricompilazione di un indice esistente nella stessa tabella.

Per altre informazioni, vedere Eseguire operazioni sugli indici online.

Operazioni sull'indice ripristinabili

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

La ricompilazione dell'indice online viene specificata come ripristinabile usando l'opzione RESUMABLE = ON.

  • L'opzione RESUMABLE non è persistente nei metadati per un determinato indice e si applica solo alla durata di un'istruzione DDL corrente. Per abilitare la funzione di ripristino, è necessario quindi che la clausola RESUMABLE = ON sia specificata in modo esplicito.

  • L'opzione MAX_DURATION è supportata per l'opzione RESUMABLE = ON o low_priority_lock_wait.

    • MAX_DURATION per RESUMABLE l'opzione specifica l'intervallo di tempo per la ricompilazione di un indice. Una volta usata questa volta, la ricompilazione dell'indice viene sospesa o completa l'esecuzione. È l'utente a decidere quando riprendere la ricompilazione di un indice che è stata sospesa. Il valore espresso in minuti in time per MAX_DURATION deve essere maggiore di 0 e minore o uguale a una settimana (7 * 24 * 60 = 10080 minuti). L'esecuzione di una pausa prolungata per un'operazione sull'indice potrebbe influire sulle prestazioni DML in una tabella specifica, nonché sulla capacità del disco del database, poiché entrambi gli indici (quello originale e quello appena creato) richiedono spazio su disco e devono essere aggiornati durante le operazioni DML. Se MAX_DURATION l'opzione viene omessa, l'operazione sull'indice continua fino al completamento o fino a quando non si verifica un errore.
    • L'opzione dell'argomento low_priority_lock_wait consente di definire il comportamento dell'operazione sull'indice quando questa è bloccata tramite il blocco SCH-M.
  • Se si esegue di nuovo l'istruzione ALTER INDEX REBUILD originale con gli stessi parametri, viene ripresa un'operazione di ricompilazione dell'indice sospesa. È possibile riprendere un'operazione di ricompilazione dell'indice sospesa anche eseguendo l'istruzione ALTER INDEX RESUME.

  • L'opzione SORT_IN_TEMPDB = ON non è supportata per un indice ripristinabile

  • Il comando DDL con RESUMABLE = ON non può essere eseguito all'interno di una transazione esplicita (non può fare parte del blocco BEGIN TRAN ... COMMIT).

  • Solo le operazioni sugli indici sospese sono ripristinabili.

  • Quando si riprende un'operazione sull'indice sospesa, è possibile modificare il MAXDOP valore in un nuovo valore. Se MAXDOP non viene specificato quando si riprende un'operazione sull'indice sospesa, viene acquisito l'ultimo MAXDOP valore. SE l'opzione MAXDOP non è specificata affatto per l'operazione di ricompilazione dell'indice, viene acquisito il valore predefinito.

  • Per sospendere immediatamente l'operazione sull'indice, è possibile arrestare il comando in corso (CTRL+C) o eseguire il comando ALTER INDEX PAUSE o KILL <session_id>. Una volta sospeso, il comando può essere ripreso usando RESUME l'opzione .

  • Il comando ABORT termina la sessione che ha ospitato la ricompilazione dell'indice originale e interrompe l'operazione sull'indice

  • Non sono necessarie risorse aggiuntive per la ricompilazione dell'indice ripristinale ad eccezione di queste:

    • Spazio aggiuntivo necessario per mantenere l'indice compilato, incluso il momento in cui l'indice viene sospeso
    • Uno stato DDL per impedire eventuali modifiche DDL
  • La pulizia fantasma viene eseguita durante la fase di sospensione dell'indice, ma viene sospesa durante l'esecuzione dell'indice. La funzionalità seguente è disabilitata per le operazioni di ricompilazione dell'indice ripristinabili

    • La ricompilazione di un indice disabilitato non è supportata con RESUMABLE = ON
    • ALTER INDEX REBUILD ALL comando
    • ALTER TABLE usando la ricompilazione dell'indice
    • Il comando DDL con RESUMABLE = ON non può essere eseguito all'interno di una transazione esplicita (non può fare parte del blocco BEGIN TRAN ... COMMIT)
    • Ricompilare un indice con colonne calcolate o TIMESTAMP colonne come colonne chiave.
  • Nel caso in cui la tabella di base contenga colonne LOB ricompilazione dell'indice cluster ripristinabile, è necessario un blocco Sch-M nell'avvio di questa operazione

Nota

Il comando DDL viene eseguito fin tanto che è completato, sospeso o non riuscito. Nel caso in cui il comando si sospende, verrà generato un errore che indica che l'operazione è stata sospesa e che la creazione dell'indice non è stata completata. Altre informazioni sullo stato corrente dell'indice sono disponibili in sys.index_resumable_operations. Come in precedenza, in caso di errore verrà generato un errore.

WAIT_AT_LOW_PRIORITY con operazioni sull'indice online

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

La sintassi low_priority_lock_wait consente di specificare il comportamento WAIT_AT_LOW_PRIORITY. È possibile usare WAIT_AT_LOW_PRIORITY solo con ONLINE = ON.

Per eseguire l'istruzione DDL per una ricompilazione dell'indice online, è necessario completare tutte le transazioni bloccanti attive in esecuzione in una specifica tabella. Quando la ricompilazione dell'indice online viene eseguita, blocca tutte le nuove transazioni pronte per l'esecuzione in questa tabella. Sebbene la durata del blocco per la ricompilazione dell'indice online sia breve, l'attesa del completamento di tutte le transazioni aperte in una determinata tabella e il blocco dell'avvio delle nuove transazioni, potrebbe influire significativamente sulla velocità effettiva, causando un rallentamento o un timeout del carico di lavoro e limitare significativamente l'accesso alla tabella sottostante.

L'opzione WAIT_AT_LOW_PRIORITY consente agli amministratori di database di gestire i blocchi di stabilità dello schema (Sch-S) e i blocchi di modifica dello schema (Sch-M) necessari per le ricompilazioni degli indici online e di selezionare una delle due opzioni. In ogni caso, se durante il tempo di attesa MAX_DURATION = n [minutes] non sono presenti attività di blocco, la ricompilazione dell'indice online viene eseguita immediatamente senza attendere il completamento dell'istruzione DDL.

WAIT_AT_LOW_PRIORITY indica che l'operazione di ricompilazione dell'indice online attende blocchi con priorità bassa, consentendo ad altre operazioni di continuare mentre l'operazione di compilazione dell'indice online è in attesa. L'omissione dell'opzione WAIT AT LOW PRIORITY equivale a WAIT_AT_LOW_PRIORITY (MAX_DURATION = 0 minutes, ABORT_AFTER_WAIT = NONE).

MAX_DURATION = tempo [ MINUTES ]

Il tempo di attesa (un valore intero specificato in minuti) che l'indice online ricompila i blocchi attende con priorità bassa durante l'esecuzione del comando DDL. Se l'operazione viene bloccata per il MAX_DURATION tempo, viene eseguita l'azione specificata ABORT_AFTER_WAIT . MAX_DURATION il tempo è sempre espresso in minuti e la parola MINUTES può essere omessa.

ABORT_AFTER_WAIT = [ NONE | edizione Standard LF | BLOCKERS ]

  • NONE

    Continuare ad attendere il blocco con priorità normale (regolare).

  • SELF

    Esce dall'operazione DDL di ricompilazione dell'indice online attualmente in esecuzione senza eseguire alcuna azione. L'opzione SELF non può essere usata con un MAX_DURATION valore pari a 0.

  • BLOCKERS

    Termina tutte le transazioni utente che bloccano l'operazione DDL di ricompilazione dell'indice online in modo da poter continuare l'operazione. L'opzione BLOCKERS richiede che l'account di accesso disponga ALTER ANY CONNECTION dell'autorizzazione.

Restrizioni relative agli indici spaziali

Quando si ricompila un indice spaziale, la tabella utente sottostante non è disponibile durante l'operazione sull'indice, in quanto l'indice spaziale acquisisce un blocco di schema.

Il PRIMARY KEY vincolo nella tabella utente non può essere modificato mentre un indice spaziale è definito in una colonna di tale tabella. Per modificare il PRIMARY KEY vincolo, eliminare innanzitutto ogni indice spaziale della tabella. Dopo aver modificato il PRIMARY KEY vincolo, è possibile ricreare ognuno degli indici spaziali.

In un'operazione di ricompilazione di una singola partizione, non è possibile specificare indici spaziali. È tuttavia possibile specificare indici spaziali in una ricompilazione di partizioni completa.

Per modificare opzioni specifiche di un indice spaziale, come BOUNDING_BOX o GRID, è possibile usare un'istruzione CREATE SPATIAL INDEX che specifica DROP_EXISTING = ON oppure eliminare l'indice spaziale e crearne uno nuovo. Per un esempio, vedere CREATE SPATIAL INDEX.

Compressione dei dati

Per altre informazioni sulla compressione dei dati, vedere Compressione dei dati.

Per valutare in che modo la modifica PAGE e ROW la compressione influiscono su una tabella, un indice o una partizione, utilizzare la stored procedure sp_estimate_data_compression_savings .

Agli indici partizionati vengono applicate le restrizioni seguenti:

  • Quando si usa ALTER INDEX ALL ..., non è possibile modificare l'impostazione di compressione di una singola partizione se la tabella include indici non allineati.
  • La sintassi ALTER INDEX <index> ... REBUILD PARTITION ... ricompila la partizione specificata dell'indice.
  • La sintassi ALTER INDEX <index> ... REBUILD WITH ... ricompila tutte le partizioni dell'indice.

Statistiche

Quando si esegue ALTER INDEX ALL ... su una tabella, vengono aggiornate solo le statistiche associate agli indici. Le statistiche automatiche o manuali create nella tabella, anziché un indice, non vengono aggiornate.

Autorizzazioni

Per eseguire ALTER INDEX, è necessaria almeno l'autorizzazione ALTER per la tabella o la vista.

Note sulla versione

  • Il database SQL non usa le opzioni per filegroup e filestream.
  • Gli indici columnstore non sono disponibili prima di SQL Server 2012 (11.x).
  • Le operazioni sugli indici ripristinabili sono disponibili a partire da SQL Server 2017 (14.x) e nel database SQL di Azure.

Esempio della sintassi di base

ALTER INDEX index1 ON table1 REBUILD;
ALTER INDEX ALL ON table1 REBUILD;
ALTER INDEX ALL ON dbo.table1 REBUILD;

Esempi: indici columnstore

Questi esempio si applicano agli indici columnstore.

R. Demo di REORGANIZE

Questo esempio mostra il funzionamento del comando ALTER INDEX REORGANIZE. Crea una tabella con più rowgroup e quindi mostra in che modo REORGANIZE unisce i rowgroup.

-- Create a database
CREATE DATABASE [columnstore];
GO

-- Create a rowstore staging table
CREATE TABLE [staging] (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Insert 10 million rows into the staging table.
DECLARE @loop INT;
DECLARE @AccountDescription VARCHAR(50);
DECLARE @AccountKey INT;
DECLARE @AccountType VARCHAR(50);
DECLARE @AccountCode INT;

SELECT @loop = 0

BEGIN TRANSACTION

WHILE (@loop < 300000)
BEGIN
    SELECT @AccountKey = CAST(RAND() * 10000000 AS INT);
    SELECT @AccountDescription = 'accountdesc ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountType = 'AccountType ' + CONVERT(VARCHAR(20), @AccountKey);
    SELECT @AccountCode = CAST(RAND() * 10000000 AS INT);

    INSERT INTO staging
    VALUES (
        @AccountKey,
        @AccountDescription,
        @AccountType,
        @AccountCode
     );

    SELECT @loop = @loop + 1;
END

COMMIT

-- Create a table for the clustered columnstore index
CREATE TABLE cci_target (
    AccountKey INT NOT NULL,
    AccountDescription NVARCHAR(50),
    AccountType NVARCHAR(50),
    AccountCodeAlternateKey INT
);

-- Convert the table to a clustered columnstore index named inxcci_cci_target;
CREATE CLUSTERED COLUMNSTORE INDEX idxcci_cci_target ON cci_target;

Usare l'opzione TABLOCK per inserire righe in parallelo. A partire da SQL Server 2016 (13.x), l'operazione INSERT INTO può essere eseguita in parallelo quando TABLOCK viene usata.

INSERT INTO cci_target WITH (TABLOCK)
SELECT TOP 300000 * FROM staging;

Eseguire questo comando per visualizzare i OPEN rowgroup differenziali. Il numero di rowgroup dipende dal grado di parallelismo.

SELECT *
FROM sys.dm_db_column_store_row_group_physical_stats
WHERE object_id  = object_id('cci_target');

Eseguire questo comando per forzare tutti i CLOSED rowgroup e OPEN nel columnstore.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

Eseguire di nuovo questo comando e si noterà che i rowgroup più piccoli vengono uniti in un unico rowgroup compresso.

ALTER INDEX idxcci_cci_target ON cci_target REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

B. Comprimere i rowgroup differenziali CLOSED nel columnstore

In questo esempio viene usata l'opzione REORGANIZE per comprimere ogni CLOSED rowgroup differenziale nel columnstore come rowgroup compresso. Questo non è necessario, ma è utile quando il tuple-mover non comprime CLOSED i rowgroup abbastanza velocemente.

È possibile eseguire entrambi gli esempi nel database di esempio AdventureWorksDW2022.

Questo esempio viene eseguito REORGANIZE in tutte le partizioni.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

Questo esempio viene eseguito REORGANIZE in una partizione specifica.

-- REORGANIZE a specific partition
ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0;

C. Comprimere tutti i rowgroup differenziali OPEN e CLOSED nel columnstore

Si applica a: SQL Server, a partire da SQL Server 2016 (13.x), e database SQL di Azure

Il comando REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON) comprime ogni OPEN rowgroup differenziale e CLOSED nel columnstore come rowgroup compresso. In questo modo i deltastore vengono svuotati e tutte le righe vengono forzate per essere compresse nel columnstore. Si tratta di un'operazione utile soprattutto dopo aver eseguito numerose operazioni di inserimento, in quanto tali operazioni archiviano le righe in uno o più rowgroup delta.

REORGANIZE combina i rowgroup per riempire i rowgroup fino a un numero massimo di righe <= 1.024.576. Pertanto, quando si comprimono tutti e OPENCLOSED i rowgroup non si finisce con un numero elevato di rowgroup compressi che contengono solo poche righe. I rowgroup devono essere il più possibile completi in modo da ridurre le dimensioni compresse e migliorare le prestazioni delle query.

Nell'esempio seguente viene utilizzato il database AdventureWorksDW2022.

In questo esempio vengono spostati tutti i OPEN rowgroup differenziali nell'indice CLOSED columnstore.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);

In questo esempio vengono spostati tutti i OPEN rowgroup differenziali nell'indice CLOSED columnstore per una partizione specifica.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE PARTITION = 0 WITH (COMPRESS_ALL_ROW_GROUPS = ON);

D. Deframmentare un indice columnstore online

Non si applica a: SQL Server 2012 (11.x) e SQL Server 2014 (12.x).

A partire da SQL Server 2016 (13.x), REORGANIZE esegue più di comprimere i rowgroup differenziali nel columnstore. ma esegue anche la deframmentazione online. In primo luogo, riduce le dimensioni del columnstore rimuovendo fisicamente le righe quando oltre il 10% delle righe in un rowgroup è stato eliminato. Poi combina i rowgroup per formare rowgroup di dimensioni più grandi che contengono fino a 1.024.576 righe per rowgroup. Tutti i rowgroup modificati vengono ricompressi.

Nota

A partire da SQL Server 2016 (13.x), la ricompilazione di un indice columnstore non è più necessaria nella maggior parte delle situazioni perché REORGANIZE rimuove fisicamente le righe eliminate e unisce i rowgroup. L'opzione COMPRESS_ALL_ROW_GROUPS forza tutti o CLOSED i OPEN rowgroup differenziali nel columnstore che in precedenza potevano essere eseguiti solo con una ricompilazione. REORGANIZE è online e si verifica in background in modo che le query possano continuare man mano che si verifica l'operazione.

Nell'esempio seguente viene eseguito un oggetto REORGANIZE per deframmentare l'indice rimuovendo fisicamente le righe eliminate logicamente dalla tabella e unendo rowgroup.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REORGANIZE;

E. Ricompilare un indice columnstore cluster offline

Si applica a: SQL Server, a partire da SQL Server 2012 (11.x)

Suggerimento

A partire da SQL Server 2016 (13.x) e nel database SQL di Azure, è consigliabile usare ALTER INDEX REORGANIZE anziché ALTER INDEX REBUILD per gli indici columnstore.

Nota

In SQL Server 2012 (11.x) e SQL Server 2014 (12.x) REORGANIZE viene usato solo per comprimere CLOSED i rowgroup nel columnstore. L'unico modo per eseguire operazioni di deframmentazione e forzare tutti i rowgroup differenziali nel columnstore consiste nella ricompilazione dell'indice.

In questo esempio viene illustrato come ricompilare un indice columnstore cluster e forzare tutti i rowgroup differenziali nel columnstore. Il primo passaggio prepara una tabella FactInternetSales2 nel database AdventureWorksDW2022 con un indice columnstore cluster e inserisce dati dalle prime quattro colonne.

CREATE TABLE dbo.FactInternetSales2 (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL);

CREATE CLUSTERED COLUMNSTORE INDEX cci_FactInternetSales2
ON dbo.FactInternetSales2;

INSERT INTO dbo.FactInternetSales2
SELECT ProductKey, OrderDateKey, DueDateKey, ShipDateKey
FROM dbo.FactInternetSales;

SELECT * FROM sys.column_store_row_groups;

I risultati mostrano un OPEN rowgroup, ovvero SQL Server attende l'aggiunta di più righe prima che chiuda il rowgroup e sposta i dati nel columnstore. L'istruzione successiva ricompila l'indice columnstore cluster, il quale forza tutte le righe nel columnstore.

ALTER INDEX cci_FactInternetSales2 ON FactInternetSales2 REBUILD;
SELECT * FROM sys.column_store_row_groups;

I risultati dell'istruzione SELECT mostrano che il rowgroup è COMPRESSED, ovvero i segmenti di colonna del rowgroup sono ora compressi e archiviati nel columnstore.

F. Ricompilare una partizione di un indice columnstore cluster offline

Si applica a: SQL Server 2012 (11.x) e versioni successive

Per ricompilare una partizione per un indice columnstore cluster di grandi dimensioni, usare ALTER INDEX REBUILD con l'opzione per la partizione. In questo esempio viene ricompilata la partizione 12. A partire da SQL Server 2016 (13.x), è consigliabile sostituire REBUILD con REORGANIZE.

ALTER INDEX cci_fact3
ON fact3
REBUILD PARTITION = 12;

G. Modificare un indice columnstore cluster per usare la compressione dell'archivio

Non si applica a: SQL Server 2012 (11.x)

È possibile scegliere di ridurre ulteriormente le dimensioni di un indice columnstore cluster usando l'opzione COLUMNSTORE_ARCHIVE di compressione dei dati. Si tratta di una procedura utile per i dati meno recenti che si vuole mantenere usando un'archiviazione più economica. È consigliabile usarlo solo sui dati a cui non si accede spesso perché la decompressione è più lenta rispetto alla compressione normale COLUMNSTORE .

Nell'esempio seguente viene ricompilato un indice columnstore cluster per l'utilizzo della compressione dell'archivio e viene illustrato come rimuovere tale compressione. Il risultato finale usa solo la compressione columnstore.

Preparare prima di tutto l'esempio creando una tabella con un indice columnstore cluster. Comprimere quindi ulteriormente la tabella usando la compressione dell'archivio.

--Prepare the example by creating a table with a clustered columnstore index.
CREATE TABLE SimpleTable (
    ProductKey [int] NOT NULL,
    OrderDateKey [int] NOT NULL,
    DueDateKey [int] NOT NULL,
    ShipDateKey [int] NOT NULL
);

CREATE CLUSTERED INDEX cci_SimpleTable ON SimpleTable (ProductKey);

CREATE CLUSTERED COLUMNSTORE INDEX cci_SimpleTable
ON SimpleTable
WITH (DROP_EXISTING = ON);

--Compress the table further by using archival compression.
ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE_ARCHIVE);
GO

Questo esempio rimuove la compressione dell'archivio e usa solo la compressione columnstore.

ALTER INDEX cci_SimpleTable ON SimpleTable
REBUILD
WITH (DATA_COMPRESSION = COLUMNSTORE);
GO

Esempi: indici rowstore

R. Ricompilare un indice

Nell'esempio seguente viene ricompilato un singolo indice della tabella Employee nel database AdventureWorks2022.

ALTER INDEX PK_Employee_EmployeeID ON HumanResources.Employee REBUILD;

B. Ricompilare tutti gli indici di una tabella e specificare le opzioni

Nell'esempio seguente viene specificata la parola chiave ALL. In questo modo, vengono ricompilati tutti gli indici associati alla tabella Production.Product nel database AdventureWorks2022. Vengono inoltre specificate tre opzioni.

ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);

Nell'esempio seguente viene aggiunta l'opzione ONLINE, inclusa l'opzione di blocco con priorità bassa, e viene aggiunta l'opzione di compressione di riga.

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

ALTER INDEX ALL ON Production.Product
REBUILD WITH
(
    FILLFACTOR = 80,
    SORT_IN_TEMPDB = ON,
    STATISTICS_NORECOMPUTE = ON,
    ONLINE = ON ( WAIT_AT_LOW_PRIORITY ( MAX_DURATION = 4 MINUTES, ABORT_AFTER_WAIT = BLOCKERS ) ),
    DATA_COMPRESSION = ROW
);

C. Ricompilazione di un indice con la compattazione di dati LOB

Nell'esempio seguente viene riorganizzato un singolo indice cluster nel database AdventureWorks2022. Poiché l'indice contiene un tipo di dati LOB al livello foglia, l'istruzione compatta inoltre tutte le pagine contenenti dati LOB. Non è necessario specificare l'opzione WITH (LOB_COMPACTION = ON) perché il valore predefinito è ON.

ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto REORGANIZE WITH (LOB_COMPACTION = ON);

D. Impostare le opzioni in un indice

Nell'esempio seguente vengono impostate diverse opzioni per l'indice AK_SalesOrderHeader_SalesOrderNumber nel database AdventureWorks2022.

ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
    Sales.SalesOrderHeader
SET (
    STATISTICS_NORECOMPUTE = ON,
    IGNORE_DUP_KEY = ON,
    ALLOW_PAGE_LOCKS = ON
    ) ;
GO

E. Disabilitare un indice

Nell'esempio seguente viene disabilitato un indice non cluster della tabella Employee nel database AdventureWorks2022.

ALTER INDEX IX_Employee_ManagerID ON HumanResources.Employee DISABLE;

F. Disabilitare i vincoli

Nell'esempio seguente viene disabilitato un PRIMARY KEY vincolo disabilitando l'indice PRIMARY KEY nel AdventureWorks2022 database. Il FOREIGN KEY vincolo sulla tabella sottostante viene disabilitato automaticamente e viene visualizzato il messaggio di avviso.

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department DISABLE;

Nel set di risultati viene restituito il messaggio di avviso seguente.

Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'
on table 'EmployeeDepartmentHistory' referencing table 'Department'
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.

G. Abilitare i vincoli

Nell'esempio seguente vengono attivati i PRIMARY KEY vincoli e FOREIGN KEY disabilitati nell'esempio F.

Il PRIMARY KEY vincolo è abilitato ricompilando l'indice PRIMARY KEY .

ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department REBUILD;

Il FOREIGN KEY vincolo viene quindi abilitato.

ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO

H. Creare un indice partizionato

Nell'esempio seguente viene ricompilata una singola partizione, con numero 5, dell'indice partizionato IX_TransactionHistory_TransactionDate nel database AdventureWorks2022. La partizione 5 viene ricompilata con ONLINE=ON e a ogni blocco acquisito dall'operazione di ricompilazione dell'indice viene applicato separatamente il tempo di attesa di 10 minuti per il blocco con priorità bassa. Se durante questo periodo di tempo non è possibile ottenere il blocco per completare la ricompilazione dell'indice, l'istruzione dell'operazione di ricompilazione viene interrotta a causa di ABORT_AFTER_WAIT = SELF.

Si applica a: SQL Server 2014 (12.x) e versioni successive e database SQL di Azure

-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5
   WITH (ONLINE = ON (WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10 minutes, ABORT_AFTER_WAIT = SELF)));
GO

I. Modificare l'impostazione di compressione di un indice

Nell'esempio seguente viene ricompilato un indice in una tabella rowstore non partizionata.

ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (DATA_COMPRESSION = PAGE);
GO

J. Modificare l'impostazione di un indice con compressione XML

Si applica a: SQL Server 2022 (16.x) e versioni successive Database SQL di Azure e Istanza gestita di SQL di Azure

Nell'esempio seguente viene ricompilato un indice in una tabella rowstore non partizionata.

ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH (XML_COMPRESSION = ON);
GO

Per altri esempi di compressione dei dati, vedere Compressione dei dati.

K. Ricompilazione dell'indice ripristinabile online

Si applica a: SQL Server 2017 (14.x) e versioni successive e database SQL di Azure

Negli esempi seguenti viene illustrato come usare la ricompilazione dell'indice ripristinabile online.

Eseguire una ricompilazione dell'indice online come operazione ripristinabile con MAXDOP = 1. L'esecuzione dello stesso comando dopo che un'operazione sull'indice è stata sospesa, riprende automaticamente l'operazione di ricompilazione dell'indice.

ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, MAXDOP = 1, RESUMABLE = ON);

Eseguire una ricompilazione dell'indice online come operazione ripristinabile con MAX_DURATION impostato su 240 minuti.

ALTER INDEX test_idx on test_table REBUILD WITH (ONLINE = ON, RESUMABLE = ON, MAX_DURATION = 240);

Sospendere un'operazione di ricompilazione dell'indice online ripristinabile in esecuzione.

ALTER INDEX test_idx on test_table PAUSE;

Riprendere una ricompilazione dell'indice online per una ricompilazione dell'indice eseguita come operazione ripristinabile specificando un nuovo valore per MAXDOP impostato su 4.

ALTER INDEX test_idx on test_table RESUME WITH (MAXDOP = 4);

Riprendere un'operazione di ricompilazione dell'indice online per una ricompilazione dell'indice online che è stata eseguita come ripristinabile. Impostare MAXDOP su 2, impostare il tempo di esecuzione per l'indice in esecuzione come ripristinabile su 240 minuti e se un indice viene bloccato sul blocco, attendere 10 minuti e dopo l'interruzione di tutti i blocchi.

ALTER INDEX test_idx on test_table
    RESUME WITH (MAXDOP = 2, MAX_DURATION = 240 MINUTES,
    WAIT_AT_LOW_PRIORITY (MAX_DURATION = 10, ABORT_AFTER_WAIT = BLOCKERS));

Interrompere l'operazione di ricompilazione dell'indice ripristinabile in esecuzione o sospesa.

ALTER INDEX test_idx on test_table ABORT;