ALTER INDEX (Transact-SQL)
Si applica a:SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
database SQL di Azure Synapse Analytics Platform
System (PDW)
in Microsoft Fabric
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 }
}
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 solo in SQL Server 2017 (14.x) e versioni precedenti. Le versioni successive supportano la ricompilazione online degli indici columnstore. |
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 = ON |
Indici ripristinabili non supportati con la parola chiave ALL |
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 altre informazioni sulle operazioni sugli indici 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 i dettagli dell'indice per una tabella o vista, usare la sys.indexes vista del catalogo.
Il database SQL di Azure supporta il formato del nome in tre parti <database_name>.<schema_name>.<object_name>
quando <database_name>
è il nome del database corrente o <database_name>
è tempdb
e <object_name>
inizia con #
o ##
. Se il nome dello schema è dbo
, è possibile omettere <schema_name>
.
REBUILD [ WITH ( <rebuild_index_option> [ ,... n ] ) ] ]
si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Specifica che l'indice viene ricompilato utilizzando le stesse colonne, tipo di indice, attributo di univocità e ordinamento.
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 le opzioni di indice non vengono specificate, vengono applicati i valori delle opzioni di indice esistenti in sys.indexes. Per qualsiasi opzione di indice il cui valore non viene visualizzato in sys.indexes
, viene applicato il valore predefinito indicato nella definizione dell'argomento dell'opzione.
Se viene specificato ALL
e la tabella sottostante è un heap, l'operazione di ricompilazione non ha alcun effetto sull'heap. Vengono ricompilati tutti gli indici non cluster associati alla tabella.
L'operazione di REBUILD
può essere registrata in modo minimo se il modello di recupero del database è registrato in blocco o semplice.
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 di ricompilazione:
- Ricomprime tutti i dati nel columnstore. Esistono due copie dell'indice columnstore mentre l'operazione di ricompilazione è in corso. Al termine della ricompilazione, il motore di database elimina l'indice columnstore originale.
- Non mantiene l'ordinamento, se presente. Per ricompilare un indice columnstore e conservare o introdurre un ordinamento, usare l'istruzione
CREATE [CLUSTERED] COLUMNSTORE INDEX ... ORDER (...) ... WITH (DROP_EXISTING = ON)
.
Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.
Partizione
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. Microsoft consiglia di usare solo indici allineati quando il numero di partizioni supera 1.000.
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
eXML_COMPRESSION
sono le opzioni che è possibile specificare quando si ricompila una singola partizione usando la sintassi(PARTITION = partition_number)
. Gli indici XML non possono essere specificati in una singola operazione di ricompilazione della 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 gli indici e i 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 dei dati nella tabella sottostante possono continuare durante la transazione
ALTER INDEX REORGANIZE
. - Non è consentita per un indice disabilitato.
- Non consentito quando
ALLOW_PAGE_LOCKS
è impostato suOFF
. - 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 SET 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.
In...
- 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 la compattazione LOB 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.
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 rowgroup differenziale chiuso 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 rowgroup differenziali chiusi in rowgroup compressi. Il processo di tupla in background viene riattivato periodicamente per comprimere i rowgroup differenziali chiusi. È consigliabile usareREORGANIZE
quando il tuple-mover è in ritardo.REORGANIZE
può comprimere i rowgroup in modo più aggressivo. - Per comprimere tutti i rowgroup aperti e chiusi, vedere REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS).
Per gli indici columnstore in SQL Server 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure, REORGANIZE
esegue online le ottimizzazioni di deframmentazione aggiuntive seguenti:
Rimuove fisicamente le righe eliminate da un rowgroup quando 10% o più righe sono state eliminate logicamente. I byte eliminati vengono recuperati sui supporti fisici. Ad esempio, se un gruppo di righe compresso di 1 milione di righe contiene 100.000 righe eliminate, il motore di database rimuove le righe eliminate e ricomprime il rowgroup con 900.000 righe.
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 con 512.000 righe. Ciò presuppone che non vi siano limitazioni di memoria o dimensioni del dizionario.Per i rowgroup in cui 10% o più righe sono state eliminate logicamente, il motore di database 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. Il motore di database favorisce la combinazione di 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 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
COMPRESS_ALL_ROW_GROUPS
consente di forzare i rowgroup differenziali aperti o chiusi nel columnstore. Con questa opzione, non è necessario ricompilare l'indice columnstore per svuotare i rowgroup differenziali. In combinazione con le altre funzionalità di rimozione e deframmentazione di tipo merge, non è più necessario ricompilare un indice columnstore nella maggior parte delle situazioni.
In...
Forza tutti i rowgroup nel columnstore, indipendentemente dalle dimensioni e dallo stato (chiuso o aperto).
OFF
Forza tutti i rowgroup chiusi nel columnstore.
Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.
SET ( <opzione> set_index [ ,... n ] )
Modifica le opzioni di indice senza ricompilare o 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 dal fattore di riempimento viene applicata alle pagine di livello intermedio dell'indice. Se
FILLFACTOR
non viene specificato contemporaneamentePAD_INDEX
è impostato suON
, viene usato il valore del fattore di riempimento in sys.indexes.OFF
Le pagine di livello intermedio vengono riempite in prossimità della capacità, lasciando spazio sufficiente per almeno una riga delle dimensioni massime che l'indice può avere, considerando il set di chiavi nelle pagine intermedie. Ciò si verifica anche se
PAD_INDEX
è impostato suON
ma il fattore di riempimento non è specificato.
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 di un indice con un FILLFACTOR
minore di 100 aumenta la quantità di spazio di archiviazione occupata dai dati perché il motore di database ridistribuisce i dati in base al fattore di riempimento quando crea o ricompila un indice.
SORT_IN_TEMPDB = { ON | OFF }
Specifica se archiviare i risultati temporanei dell'ordinamento in tempdb
. Il valore predefinito è OFF
ad eccezione di database SQL di Azure Hyperscale. Per tutte le operazioni di compilazione degli indici in Hyperscale, SORT_IN_TEMPDB
è sempre ON
a meno che non venga usata una compilazione di indice ripristinabile. Per le compilazioni degli indici ripristinabili, SORT_IN_TEMPDB
è sempre OFF
.
In...
I risultati di ordinamento intermedi usati per compilare l'indice vengono archiviati in
tempdb
. Ciò 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à non vengono inserite.
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 l'impostazione IGNORE_DUP_KEY
per un indice, usare la colonna ignore_dup_key
nella vista del catalogo 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 sull'indice. 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_NORECOMPUTE
OFF
o eseguire UPDATE STATISTICS
senza la NORECOMPUTE
clausola .
Avviso
Se si disabilita la ricompilazione automatica delle statistiche impostando STATISTICS_NORECOMPUTE = ON
, è possibile impedire a Query Optimizer di scegliere piani di esecuzione ottimali per le query che coinvolgono la tabella.
L'impostazione di STATISTICS_NORECOMPUTE
su ON
non impedisce l'aggiornamento delle statistiche sugli indici che si verificano durante l'operazione di ricompilazione dell'indice.
STATISTICS_INCREMENTAL = { ON | OFF }
si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Quando ON
, le statistiche create nell'indice sono per statistiche di partizione. Quando OFF
, le statistiche esistenti vengono eliminate e il motore di database 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 nei casi 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 }
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 per la durata dell'operazione sull'indice. Durante la fase principale dell'operazione sull'indice, nella tabella di origine viene mantenuto solo un blocco condiviso (
IS
). In questo modo, le query o gli aggiornamenti alla tabella e agli indici sottostanti possono continuare. All'inizio dell'operazione, un blocco condiviso (S
) viene mantenuto sull'oggetto di origine per un breve periodo di tempo. Alla fine dell'operazione, per un breve periodo di tempo, viene acquisito un blocco condiviso (S
) sull'oggetto 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 suON
quando viene creato un indice in una tabella temporanea locale.Nota
È possibile usare l'opzione
WAIT_AT_LOW_PRIORITY
per ridurre o evitare il blocco durante le operazioni sugli indici online. Per altre informazioni, vedere WAIT_AT_LOW_PRIORITY con operazioni sugli indici online.OFF
I blocchi di tabella vengono applicati per la durata dell'operazione sull'indice. Un'operazione di indice offline che crea, ricompila o elimina un indice cluster, spaziale o XML oppure ricompila o elimina un indice non cluster, acquisisce un blocco dello schema (
Sch-M
) sulla tabella. In questo modo si impedisce a tutti gli utenti di accedere alla tabella sottostante per la durata dell'operazione. Un'operazione sull'indice offline che crea un indice non cluster acquisisce inizialmente un blocco condiviso (S
) sulla tabella. Ciò impedisce modifiche della definizione di tabella sottostante, ma consente la lettura e la modifica dei dati nella tabella mentre la compilazione dell'indice è in corso.
Per altre informazioni, vedere Eseguire operazioni sugli indici online e linee guida per le 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 cluster disabilitati
- Indici columnstore cluster in SQL Server 2017 (14.x)) e versioni precedenti
- Indici columnstore non cluster in SQL Server 2016 (13.x)) e versioni precedenti
- Indice cluster, se la tabella sottostante contiene tipi di dati LOB (image, ntext, text) e tipi spaziali
-
varchar(max) e colonne varbinary(max) non possono far parte di una chiave di indice. In SQL Server (a partire da SQL Server 2012 (11.x)), nel database SQL di Azure e in Istanza gestita di SQL di Azure, quando una tabella contiene varchar(max) o colonne varbinary(max), è possibile creare o ricompilare un indice cluster contenente altre colonne usando l'opzione
ONLINE
.
Per altre informazioni, vedere Funzionamento delle operazioni sugli indici online.
RESUMABLE = { ON | OFF}
Si applica a: SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di 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, database SQL di Azure e Istanza gestita di SQL di Azure
Specifica per quanto tempo, in minuti interi, viene eseguita un'operazione di indice ripristinabile prima che venga sospesa.
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.
OPTIMIZE_FOR_SEQUENTIAL_KEY = { ON | OFF }
Si applica a: SQL Server 2019 (15.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Specifica se ottimizzare per evitare conflitti di inserimento dell'ultima pagina. Il valore predefinito è OFF
. Per altre informazioni, vedere chiavi sequenziali.
MAXDOP = max_degree_of_parallelism
Esegue l'override dell'opzione di configurazione massimo grado di parallelismo per l'operazione sull'indice. Per altre informazioni, vedere Configurare l'opzione di configurazione del server max degree of parallelism. Usare MAXDOP
per limitare il grado di parallelismo e il consumo di risorse risultante per un'operazione di compilazione dell'indice.
Sebbene l'opzione MAXDOP
sia sintatticamente supportata per tutti gli indici XML e gli indici spaziali, ALTER INDEX
attualmente usa solo un singolo processore.
max_degree_of_parallelism può essere:
1
Elimina la generazione di piani paralleli.
>1
Limita il grado massimo di parallelismo usato in un'operazione di indice parallelo al numero specificato o meno in base al carico di lavoro di sistema corrente.
0 (impostazione predefinita)
Usa il grado di parallelismo specificato a livello di server, database o gruppo del carico di lavoro, a meno che non venga ridotto in base al carico di lavoro di sistema corrente.
Per altre informazioni, vedere Configurare le 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 2022.
COMPRESSION_DELAY = { 0 | duration [ minutes ] }
Si applica a: SQL Server (a partire da SQL Server 2016 (13.x)), database SQL di Azure e Istanza gestita di SQL di Azure
Per una tabella basata su disco con un indice columnstore, specifica il numero minimo di minuti in cui un rowgroup differenziale nello stato chiuso deve rimanere nell'archivio differenziale prima che il motore di database possa comprimerlo in un rowgroup compresso. Poiché le tabelle basate su disco non tengono traccia dei tempi di inserimento e aggiornamento nelle singole righe, il motore di database applica questo ritardo solo ai rowgroup di archiviazione differenziale nello stato chiuso.
Il valore predefinito è 0 minuti.
Per consigli su quando usare COMPRESSION_DELAY
, vedere Introduzione al 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, database SQL di Azure e Istanza gestita di SQL di Azure
Si applica solo agli indici columnstore, inclusi gli indici columnstore cluster e quelli non cluster. Se si specifica
COLUMNSTORE
, vengono rimosse tutte le altre compressione dei dati, inclusaCOLUMNSTORE_ARCHIVE
.COLUMNSTORE_ARCHIVE
si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di 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)
.
<range>
può essere specificato come 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)
);
RESUME
Si applica a: SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Riprende un'operazione sull'indice sospesa manualmente, perché viene raggiunta la durata massima o a causa di un errore.
MAX_DURATION
Specifica per quanto tempo, in minuti interi, viene eseguita un'operazione di indice ripristinabile dopo essere stata ripresa prima che venga nuovamente sospesa.
WAIT_AT_LOW_PRIORITY
La ripresa di un'operazione di compilazione dell'indice dopo una pausa deve acquisire i blocchi necessari.
WAIT_AT_LOW_PRIORITY
indica che l'operazione di compilazione dell'indice acquisisce blocchi con priorità bassa, che consentono ad altre operazioni di continuare mentre l'operazione di compilazione dell'indice è in attesa. L'omissione dell'opzioneWAIT_AT_LOW_PRIORITY
equivale aWAIT_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, database SQL di Azure e Istanza gestita di SQL di Azure
Sospende un'operazione di compilazione dell'indice ripristinabile.
ABORT
Si applica a: SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Interrompe un'operazione di compilazione dell'indice in esecuzione o sospesa avviata come ripristinabile. È necessario eseguire in modo esplicito un comando ABORT
per terminare un'operazione di compilazione dell'indice ripristinabile. Un errore o una pausa in un'operazione di indice ripristinabile non termina l'esecuzione; lascia invece l'operazione in uno stato di pausa 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. Al contrario, ALTER INDEX REORGANIZE
è un'operazione a thread singolo. Per altre informazioni, vedere Configurare le operazioni parallele sugli indici.
Nel database SQL in Microsoft Fabric ALTER INDEX ALL
non è supportato, ma ALTER INDEX <index name>
è .
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 Deallocazione posticipata.
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. Alcune restrizioni di si applicano quando si specifica ALL
.
Per altre informazioni, vedere Ottimizzare la manutenzione degli indici per migliorare le prestazioni delle query e ridurre l'utilizzo delle risorse.
Nota
Per una tabella con un indice columnstore 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 verificare se un indice è disabilitato, utilizzare la colonna is_disabled
nella vista del catalogo sys.indexes
.
Nota
Nella documentazione viene usato in modo generico il termine albero B in riferimento agli indici. Negli indici rowstore, il motore di database implementa un albero B+. Ciò non si applica a indici columnstore o a indici in tabelle ottimizzate per la memoria. Per altre informazioni, vedere Architettura e guida per la progettazione degli indici SQL Server e Azure SQL.
Se una tabella si trova in una pubblicazione di replica transazionale, non è possibile disabilitare un indice associato a un vincolo di chiave primaria. Questi indici sono necessari per la replica. Per disabilitare tale indice, è prima 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_KEY
e 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 | Si applica a |
---|---|
ALLOW_ROW_LOCKS = ON o OFF |
Heap e tutti gli indici non cluster associati. |
ALLOW_PAGE_LOCKS = ON |
Heap e tutti gli indici non cluster associati. |
ALLOW_PAGE_LOCKS = OFF |
Indici non cluster, in cui non sono consentiti tutti i blocchi di pagina. Per l'heap, non sono consentiti solo i blocchi di pagina condivisi (S ), update (U ) ed esclusivi (X ). Il motore di database può comunque acquisire blocchi di pagina delle finalità (IS , IU o IX ) per scopi interni. |
Avviso
Non è consigliabile disabilitare i blocchi di riga o di pagina in un indice. Potrebbero verificarsi problemi correlati alla concorrenza e alcune funzionalità potrebbero non essere disponibili. Ad esempio, non è possibile riorganizzare un indice quando ALLOW_PAGE_LOCKS
è impostato su OFF
.
Operazioni online sugli indici
Quando si ricompila un indice e l'opzione ONLINE
è impostata su ON
, i dati nell'indice, la tabella associata e altri indici nella stessa tabella sono disponibili per le query e la modifica. È 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 alla fine della ricompilazione dell'indice.
La riorganizzazione di un indice viene sempre eseguita online. Il processo contiene blocchi solo per brevi periodi di tempo ed è improbabile che blocchi query o aggiornamenti.
È 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, database SQL di Azure e Istanza gestita di SQL di Azure
È possibile ricompilare un indice online ripristinabile. Ciò significa che la ricompilazione dell'indice può essere arrestata e riavviata in un secondo momento dal punto in cui è stata arrestata. Per eseguire una ricompilazione dell'indice come ripristinabile, specificare l'opzione RESUMABLE = ON
.
Le linee guida seguenti si applicano alle operazioni di indice ripristinabili:
- Per usare l'opzione
RESUMABLE
è necessario usare anche l'opzioneONLINE
. - L'opzione
RESUMABLE
non viene salvata in modo permanente nei metadati per un determinato indice e si applica solo alla durata dell'istruzione DDL corrente. Per abilitare la funzione di ripristino, è necessario quindi che la clausolaRESUMABLE = ON
sia specificata in modo esplicito. - L'opzione
MAX_DURATION
può essere specificata in due contesti:-
MAX_DURATION
per l'opzioneRESUMABLE
specifica l'intervallo di tempo per la compilazione di un indice. Dopo questo intervallo di tempo e, se la compilazione dell'indice è ancora in esecuzione, viene sospesa. Si decide quando è possibile riprendere la compilazione per un indice sospeso. Il tempo in minuti perMAX_DURATION
deve essere maggiore di 0 minuti e minore o uguale a una settimana (7 * 24 * 60 = 10080 minuti). Una pausa prolungata in un'operazione sull'indice potrebbe influire notevolmente sulle prestazioni DML in una tabella specifica, nonché sulla capacità del disco del database, poiché sia l'indice originale che l'indice appena creato richiedono spazio su disco e devono essere aggiornati dalle operazioni DML. SeMAX_DURATION
'opzione viene omessa, l'operazione sull'indice continua fino al completamento o fino a quando non si verifica un errore. -
MAX_DURATION
per l'opzioneWAIT_AT_LOW_PRIORITY
specifica il tempo di attesa tramite blocchi con priorità bassa se l'operazione sull'indice è bloccata, prima di eseguire un'azione. Per altre informazioni, vedere WAIT_AT_LOW_PRIORITY con operazioni sugli indici online.
-
- Per sospendere immediatamente l'operazione sull'indice, è possibile eseguire il comando
ALTER INDEX PAUSE
oppure eseguire il comandoKILL <session_id>
. - 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'istruzioneALTER INDEX RESUME
. - Il comando
ABORT
termina la sessione che esegue una compilazione dell'indice e annulla l'operazione sull'indice. Non è possibile riprendere un'operazione di indice interrotta. - Quando si riprende un'operazione di ricompilazione dell'indice sospesa, è possibile modificare il valore
MAXDOP
in un nuovo valore. SeMAXDOP
non viene specificato durante la ripresa di un'operazione di indice sospesa, viene utilizzato il valoreMAXDOP
utilizzato per l'ultima ripresa. Se l'opzioneMAXDOP
non è specificata affatto per un'operazione di ricompilazione dell'indice, viene usato il valore predefinito.
Un'operazione di indice ripristinabile viene eseguita fino a quando non viene completata, sospesa o non riesce. Nel caso in cui l'operazione venga sospesa, viene generato un errore che indica che l'operazione è stata sospesa e che la ricompilazione dell'indice non è stata completata. Nel caso in cui l'operazione non riesca, viene generato anche un errore.
Per verificare se un'operazione sull'indice viene eseguita come operazione ripristinabile e per controllarne lo stato di esecuzione corrente, usare la vista del catalogo sys.index_resumable_operations.
Risorse
Per le operazioni di indice ripristinabili sono necessarie le risorse seguenti:
- Spazio aggiuntivo necessario per mantenere l'indice compilato, incluso il momento in cui la compilazione viene sospesa.
- Velocità effettiva del log aggiuntiva durante la fase di ordinamento. L'utilizzo complessivo dello spazio di log per l'indice ripristinabile è inferiore rispetto alla normale ricompilazione dell'indice online e consente il troncamento del log durante questa operazione.
- Le istruzioni DDL che tentano di modificare un indice che viene ricompilato o la tabella associata mentre l'operazione sull'indice è sospesa non sono consentite.
- La pulizia fantasma viene bloccata nell'indice di compilazione per la durata dell'operazione sia durante la sospensione che durante l'esecuzione dell'operazione.
- Se la tabella contiene colonne LOB, una compilazione di indice cluster ripristinabile richiede una modifica dello schema (
Sch-M
) blocco all'inizio dell'operazione.
Limitazioni funzionali correnti
Le operazioni di ricompilazione degli indici ripristinabili presentano le limitazioni seguenti:
- L'opzione
SORT_IN_TEMPDB = ON
non è supportata per le operazioni di indice ripristinabili. - Il comando DDL con
RESUMABLE = ON
non può essere eseguito all'interno di una transazione esplicita. - Non è possibile creare un indice ripristinabile che contiene:
- Calcolato o timestamp/rowversion colonne come colonne chiave.
- Colonna LOB come colonna inclusa.
- Le operazioni di indice ripristinabili non sono supportate per:
- Comando
ALTER INDEX REBUILD ALL
- Comando
ALTER TABLE REBUILD
- Indici columnstore
- Indici filtrati
- Indici disabilitati
- Comando
WAIT_AT_LOW_PRIORITY con operazioni sull'indice online
si applica a: SQL Server 2014 (12.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure
Quando non si usa l'opzione WAIT_AT_LOW_PRIORITY
, tutte le transazioni di blocco attive che contengono blocchi nella tabella o nell'indice devono essere completate affinché l'operazione di ricompilazione dell'indice venga avviata e completata. Quando l'operazione sull'indice online viene avviata e prima del completamento, deve acquisire un blocco condiviso (S
) o una modifica dello schema (Sch-M
) sulla tabella e tenerla in attesa per un breve periodo di tempo. Anche se il blocco viene mantenuto solo per un breve periodo di tempo, potrebbe influire significativamente sulla velocità effettiva del carico di lavoro, aumentare la latenza delle query o causare timeout di esecuzione.
Per evitare questi problemi, l'opzione WAIT_AT_LOW_PRIORITY
consente di gestire il comportamento di S
o Sch-M
blocchi necessari per l'avvio e il completamento di un'operazione sull'indice online, selezionando da tre opzioni. In tutti i casi, se durante il tempo di attesa specificato da MAX_DURATION = n [minutes]
non esiste alcun blocco che implica l'operazione sull'indice, l'operazione sull'indice procede immediatamente.
WAIT_AT_LOW_PRIORITY
fa attendere l'attesa dell'operazione sull'indice online usando blocchi con priorità bassa, consentendo ad altre operazioni di usare blocchi di priorità normali per procedere nel frattempo. 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
]
Tempo di attesa (valore intero specificato in minuti) che l'operazione sull'indice online attende usando blocchi con priorità bassa. 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
| SELF
| BLOCKERS
]
-
NONE
: continuare ad attendere il blocco con priorità normale. -
SELF
: uscire dall'operazione sull'indice online attualmente in esecuzione, senza eseguire alcuna azione. L'opzioneSELF
non può essere usata quandoMAX_DURATION
è 0. -
BLOCKERS
: terminare tutte le transazioni utente che bloccano l'operazione sull'indice online in modo che l'operazione possa continuare. L'opzioneBLOCKERS
richiede che l'entità che esegue l'istruzioneCREATE INDEX
oALTER INDEX
disponga dell'autorizzazioneALTER ANY CONNECTION
.
È possibile usare gli eventi estesi seguenti per monitorare le operazioni sugli indici che attendono blocchi con priorità bassa:
lock_request_priority_state
process_killed_by_abort_blockers
ddl_with_wait_at_low_priority
Restrizioni relative agli indici spaziali
Quando si ricompila un indice spaziale, la tabella utente sottostante non è disponibile durante l'operazione sull'indice.
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 gli indici spaziali in una ricompilazione della tabella.
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.
Di seguito sono riportati i punti chiave da considerare nel contesto delle operazioni di compilazione degli indici quando viene usata la compressione dei dati:
- La compressione può consentire l'archiviazione di più righe in una pagina, ma non modifica le dimensioni massime della riga.
- Le pagine non foglia di un indice non sono compresse a pagina, ma possono essere compresse.
- Ogni indice non cluster ha una singola impostazione di compressione e non eredita l'impostazione di compressione della tabella sottostante.
- Quando viene creato un indice cluster in un heap, l'indice cluster eredita lo stato di compressione dell'heap a meno che non venga specificato uno stato di compressione alternativo.
Le considerazioni seguenti applicano la ricompilazione degli indici partizionati:
- Non è possibile modificare l'impostazione di compressione di una singola partizione se la tabella contiene indici non allineati.
- La sintassi
ALTER INDEX <index> ... REBUILD PARTITION ... WITH DATA_COMPRESSION = ...
ricompila la partizione specificata dell'indice con l'opzione di compressione specificata. Se la clausolaWITH DATA_COMPRESSION
viene omessa, viene utilizzata l'opzione di compressione esistente. - La sintassi
ALTER INDEX <index> ... REBUILD PARTITION = ALL
ricompila tutte le partizioni dell'indice usando le opzioni di compressione esistenti. - La sintassi
ALTER INDEX <index> ... REBUILD PARTITION = ALL (WITH ...)
ricompila tutte le partizioni dell'indice. È possibile scegliere una compressione diversa per partizioni diverse usando la clausolaDATA_COMPRESSION = ... ON PARTITIONS ( ...)
.
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 .
Statistiche
Quando si ricompila un indice, le statistiche sull'indice vengono aggiornate con l'analisi completa degli indici non partizionati e con il rapporto di campionamento predefinito per gli indici partizionati. Nessun'altra statistica sulla tabella viene aggiornata come parte della ricompilazione dell'indice.
Autorizzazioni
È necessaria l'autorizzazione ALTER
per la tabella o la vista.
Note sulla versione
- Il database SQL di Azure non supporta filegroup diversi da
PRIMARY
. - Il database SQL di Azure e l'istanza gestita di SQL di Azure non supportano le opzioni
FILESTREAM
. - Gli indici columnstore non sono disponibili prima di SQL Server 2012 (11.x).
- Le operazioni sugli indici ripristinabili sono disponibili in SQL Server 2017 (14.x) e versioni successive, database SQL di Azure e Istanza gestita di 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 2016 (13.x) e versioni successive, database SQL di Azure e Istanza gestita di 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 OPEN
CLOSED
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 OPEN
i CLOSED
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, database SQL di Azure e Istanza gestita di SQL di Azure
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, database SQL di Azure e Istanza gestita di SQL di Azure
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, database SQL di Azure e Istanza gestita di 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, database SQL di Azure e Istanza gestita di 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, database SQL di Azure e Istanza gestita di 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;
Contenuto correlato
- Architettura e guida per la progettazione degli indici di SQL Server
- Eseguire operazioni online sugli indici
- CREATE INDEX (Transact-SQL)
- CREATE SPATIAL INDEX (Transact-SQL)
- CREATE XML INDEX (Transact-SQL)
- DROP INDEX (Transact-SQL)
- Disabilitare indici e vincoli
- Indici XML (SQL Server)
- Ottimizzare la manutenzione dell'indice per migliorare le prestazioni delle query e ridurre il consumo di risorse
- sys.dm_db_index_physical_stats (Transact-SQL)
- EVENTDATA (Transact-SQL)