Condividi tramite


Requisiti di spazio su disco per operazioni DLL sugli indici

Quando si creano, ricostruiscono o eliminano indici, è importante considerare lo spazio su disco. Uno spazio su disco non adeguato può comportare una riduzione delle prestazioni o provocare un errore dell'operazione sull'indice. In questo argomento vengono fornite informazioni generali utili per determinare la quantità di spazio su disco necessaria per operazioni DLL (Data Definition Language) sugli indici.

Operazioni sugli indici che non richiedono spazio su disco aggiuntivo

Le operazioni seguenti non richiedono spazio su disco aggiuntivo:

  • ALTER INDEX REORGANIZE. È tuttavia richiesto spazio nel log.

  • DROP INDEX quando si elimina un indice non cluster.

  • DROP INDEX quando si elimina un indice cluster non in linea senza specificare la clausola MOVE TO e non sono presenti indici non cluster.

  • CREATE TABLE (vincoli PRIMARY KEY o UNIQUE)

Operazioni sugli indici che richiedono spazio su disco aggiuntivo

Tutte le altre operazioni DLL sugli indici richiedono spazio su disco aggiuntivo temporaneo da utilizzare durante l'operazione e spazio su disco permanente per l'archiviazione della nuova o delle nuove strutture dell'indice. Per ulteriori informazioni sulle strutture dell'indice, vedere Architettura delle strutture di dati di indici e tabelle.

Quando viene creata una nuova struttura dell'indice, è necessario spazio su disco per la struttura vecchia (origine) e per quella nuova (destinazione) nei file e filegroup appropriati. La struttura vecchia non viene deallocata fino a quando non viene eseguito il commit della transazione di creazione dell'indice.

Le operazioni DLL sugli indici seguenti comportano la creazione di nuove strutture dell'indice e richiedono spazio su disco aggiuntivo:

  • CREATE INDEX

  • CREATE INDEX WITH DROP_EXISTING

  • ALTER INDEX REBUILD

  • ALTER TABLE ADD CONSTRAINT (PRIMARY KEY o UNIQUE)

  • ALTER TABLE DROP CONSTRAINT (PRIMARY KEY o UNIQUE) quando il vincolo è basato su un indice cluster

  • DROP INDEX MOVE TO (solo per indici cluster)

Spazio su disco temporaneo per l'ordinamento

Oltre allo spazio su disco necessario per le strutture di origine e di destinazione, è necessario spazio su disco temporaneo per l'ordinamento, a meno che tramite Query Optimizer non venga individuato un piano di esecuzione che non richiede l'ordinamento.

L'ordinamento, se necessario, viene eseguito in un nuovo indice per volta. Quando, ad esempio, si ricostruiscono un indice cluster e gli indici non cluster associati in una singola istruzione, gli indici vengono ordinati uno dopo l'altro. Lo spazio su disco aggiuntivo temporaneo necessario per l'ordinamento corrisponde pertanto alle dimensioni dell'indice di dimensioni maggiori coinvolto nell'operazione, che è solitamente l'indice cluster.

Se l'opzione SORT_IN_TEMPDB è impostata su ON, l'indice di dimensioni maggiori deve poter essere contenuto in tempdb. Sebbene questa opzione comporti l'aumento della quantità di spazio su disco temporaneo necessario per creare un indice, potrebbe consentire di ridurre il tempo necessario per questa operazione quando tempdb si trova in un set di dischi diverso da quello in cui si trova il database utente. Per ulteriori informazioni sull'ordinamento in tempdb, vedere tempdb e creazione dell'indice.

Se l'opzione SORT_IN_TEMPDB è impostata su OFF, ovvero il valore predefinito, ogni indice, inclusi gli indici partizionati, viene archiviato nel relativo spazio su disco di destinazione ed è necessario solo lo spazio su disco per le nuove strutture dell'indice.

Per un esempio di come calcolare lo spazio su disco, vedere Esempio di spazio su disco per gli indici.

Spazio su disco temporaneo per operazioni sugli indici in linea

Quando si eseguono operazioni sugli indici in linea, è necessario spazio su disco aggiuntivo temporaneo.

Quando viene creato, rigenerato o eliminato un indice cluster in linea, viene creato un indice non cluster temporaneo per l'esecuzione del mapping tra vecchi segnalibri e nuovi segnalibri. Se l'opzione SORT_IN_TEMPDB è impostata su ON, questo indice temporaneo viene creato in tempdb. Se l'opzione SORT_IN_TEMPDB è impostata su OFF, viene utilizzato lo stesso filegroup o schema di partizione dell'indice di destinazione. L'indice di mapping temporaneo contiene un record per ogni riga della tabella e i contenuti sono costituiti dall'unione delle colonne di segnalibri vecchi e nuovi, inclusi uniqueifiers e identificatori di record e includono una singola copia di ogni colonna utilizzata in entrambi i segnalibri. Per ulteriori informazioni sulle operazioni sugli indici in linea, vedere Esecuzione di operazioni in linea su indici.

[!NOTA]

Non è possibile impostare l'opzione SORT_IN_TEMPDB per le istruzioni DROP INDEX. L'indice di mapping temporaneo viene sempre creato nello stesso filegroup o schema di partizione dell'indice di destinazione.

Nelle operazioni sugli indici in linea viene utilizzato il controllo delle versioni delle righe per isolare le operazioni dagli effetti delle modifiche apportate da altre transazioni. In questo modo, non è necessario richiedere blocchi di condivisione sulle righe lette. Le operazioni utente simultanee di aggiornamento ed eliminazione durante le operazioni sugli indici in linea richiedono spazio per i record di versione in tempdb. Per ulteriori informazioni, vedere Esecuzione di operazioni in linea su indici e Informazioni sui livelli di isolamento basati sul controllo delle versioni delle righe.