Condividi tramite


Esempio di spazio su disco per gli indici

Ogni volta che viene creato, ricostruito o eliminato un indice, nei file e nei filegroup appropriati è necessario spazio su disco per le strutture di origine (vecchie) e di destinazione (nuove). La struttura di origine non viene deallocata finché non viene eseguito il commit della transazione di creazione dell'indice. Potrebbe essere necessario spazio su disco temporaneo aggiuntivo per le operazioni di ordinamento. Per ulteriori informazioni, vedere Requisiti di spazio su disco per operazioni DLL sugli indici.

In questo esempio vengono determinati i requisiti di spazio su disco per la creazione di un indice cluster.

Viene presupposto che le condizioni seguenti siano vere prima della creazione dell'indice cluster:

  • La tabella esistente (heap) contiene 1 milione di righe. Ogni riga è lunga 200 byte.

  • L'indice non cluster A contiene 1 milione di righe. Ogni riga è lunga 50 byte.

  • L'indice non cluster B contiene 1 milione di righe. Ogni riga è lunga 80 byte.

  • L'opzione "index create memory" è impostata su 2 MB.

  • Per tutti gli indici, esistenti e nuovi, il valore del fattore di riempimento è 80. Questo significa che le pagine sono piene all'80 percento.

    [!NOTA]

    Dopo aver creato un indice cluster, è necessario ricostruire i due indici non cluster per sostituire l'indicatore di riga con la nuova chiave dell'indice cluster.

Calcoli dello spazio su disco per un'operazione sull'indice non in linea

Nei passaggi seguenti vengono calcolati sia lo spazio su disco temporaneo da utilizzare durante l'operazione sull'indice, sia lo spazio su disco permanente necessario per l'archiviazione dei nuovi indici. I calcoli illustrati sono approssimativi: i risultati vengono arrotondati in eccesso e vengono considerate solo le dimensioni del livello foglia dell'indice. Per indicare i calcoli approssimati viene utilizzata la tilde (~).

  1. Determinare le dimensioni delle strutture esistenti (di origine).

    Heap: 1 milione * 200 byte ~ 200 MB

    Indice non cluster A: 1 milione * 50 byte / 80% ~ 63 MB

    Indice non cluster B: 1 milione * 80 byte / 80% ~ 100 MB

    Dimensioni totali delle strutture esistenti: 363 MB

  2. Determinare le dimensioni delle strutture nuove (di destinazione). Si presuppone che la nuova chiave di clustering sia lunga 24 byte incluso un uniqueifier. L'indicatore di riga (lungo 8 byte) in entrambi gli indici non cluster verrà sostituito da questa chiave di clustering.

    Indice cluster: 1 milione * 200 byte / 80% ~ 250 MB

    Indice non cluster A: 1 milione * (50 – 8 + 24) byte / 80% ~ 83 MB

    Indice non cluster B: 1 milione * (80 – 8 + 24) byte / 80% ~ 120 MB

    Dimensioni totali delle nuove strutture: 453 MB

    Lo spazio su disco totale necessario per supportare entrambe le strutture di origine e di destinazione per la durata dell'operazione sul'indice è di 816 MB (363 + 453). Lo spazio attualmente allocato alle strutture di origine verrà deallocato dopo il commit dell'operazione sull'indice.

  3. Determinare ulteriore spazio su disco temporaneo per l'ordinamento.

    Vengono illustrati i requisiti di spazio per l'ordinamento in tempdb (con SORT_IN_TEMPDB impostato su ON) e per l'ordinamento nella posizione di destinazione (con SORT_IN_TEMPDB impostato su OFF).

    1. Quando SORT_IN_TEMPDB è impostato su ON, in tempdb deve essere disponibile spazio su disco sufficiente per contenere l'indice di dimensioni maggiori (1 milione * 200 byte ~ 200 MB). Nell'operazione di ordinamento non è considerato il fattore di riempimento.

      Spazio su disco aggiuntivo (nel percorso di tempdb) uguale al valore dell'opzione index create memory = 2 MB.

      Dimensioni totali dello spazio su disco temporaneo con SORT_IN_TEMPDB impostata su ON ~ 202 MB.

    2. Quando SORT_IN_TEMPDB è impostato su OFF (impostazione predefinita), per l'ordinamento vengono utilizzati i 250 MB di spazio su disco già considerati per il nuovo indice nel passaggio 2.

      Spazio su disco aggiuntivo (nel percorso di destinazione) uguale al valore dell'opzione index create memory = 2 MB.

      Dimensioni totali dello spazio su disco temporaneo con SORT_IN_TEMPDB impostato su OFF = 2 MB.

Se si utilizza tempdb, per creare gli indici cluster e non cluster sarebbero necessari in totale 1018 MB (816 + 202). Utilizzando tempdb aumenta la quantità di spazio su disco temporaneo utilizzata per creare un indice, tuttavia può ridursi il tempo necessario per creare un indice quando tempdb si trova in un set di dischi diversi da quello del database utente. Per ulteriori informazioni sull'utilizzo di tempdb, vedere tempdb e creazione dell'indice.

Se non si utilizza tempdb, per creare gli indici cluster e non cluster sarebbero necessari in totale 818 MB (816+ 2).

Calcoli dello spazio su disco per un'operazione sull'indice cluster in linea

Quando si crea, elimina o ricostruisce un indice cluster in linea, è necessario spazio su disco aggiuntivo per creare e gestire un indice di mapping temporaneo. L'indice di mapping temporaneo contiene un record per ogni riga della tabella e il suo contenuto è costituito dall'unione delle colonne di segnalibri vecchie e nuove.

Per calcolare lo spazio su disco necessario per un'operazione sull'indice cluster in linea, seguire la procedura illustrata per un'operazione su un indice non in linea e aggiungere i risultati a quelli ottenuti con il passaggio seguente.

  • Determinare lo spazio per l'indice di mapping temporaneo.

    In questo esempio il vecchio segnalibro è l'ID di riga (RID) dell'heap (8 byte) e il nuovo segnalibro è la chiave di clustering (24 byte incluso un elemento di identificazione univoco (uniqueifier)). Tra i vecchi e i nuovi segnalibri non vi sono colonne sovrapposte.

    Dimensioni dell'indice di mapping temporaneo = 1 milione * (8 byte + 24 byte) / 80% ~ 40 MB.

    Lo spazio su disco deve essere aggiunto allo spazio su disco necessario nel percorso di destinazione se SORT_IN_TEMPDB è impostato su OFF o in tempdb se SORT_IN_TEMPDB è impostato su ON.

Per ulteriori informazioni sull'indice di mapping temporaneo, vedere Requisiti di spazio su disco per operazioni DLL sugli indici.

Riepilogo dello spazio su disco

Nella tabella seguente sono riportati i risultati dei calcoli dello spazio su disco.

Operazione sull'indice

Requisiti di spazio su disco per i percorsi delle strutture seguenti

Operazione sull'indice non in linea con SORT_IN_TEMPDB = ON

Spazio totale durante l'operazione: 1018 MB

  • Tabella e indici esistenti: 363 MB*

  • tempdb: 202 MB*

  • Nuovi indici: 453 MB

Spazio totale necessario dopo l'operazione: 453 MB

Operazione sull'indice non in linea con SORT_IN_TEMPDB = OFF

Spazio totale durante l'operazione: 816 MB

  • Tabella e indici esistenti: 363 MB*

  • Nuovi indici: 453 MB

Spazio totale necessario dopo l'operazione: 453 MB

Operazione sull'indice in linea con SORT_IN_TEMPDB = ON

Spazio totale durante l'operazione: 1058 MB

  • Tabella e indici esistenti: 363 MB*

  • tempdb (include l'indice di mapping): 242 MB*

  • Nuovi indici: 453 MB

Spazio totale necessario dopo l'operazione: 453 MB

Operazione sull'indice in linea con SORT_IN_TEMPDB = OFF

Spazio totale durante l'operazione: 856 MB

  • Tabella e indici esistenti: 363 MB*

  • Indice di mapping temporaneo: 40 MB*

  • Nuovi indici: 453 MB

Spazio totale necessario dopo l'operazione: 453 MB

*Questo spazio viene deallocato dopo il commit dell'operazione sull'indice.

In questo esempio non viene considerato lo spazio su disco temporaneo aggiuntivo necessario in tempdb per i record delle versioni creati dalle operazioni simultanee di aggiornamento ed eliminazione. Per ulteriori informazioni, vedere Informazioni sui livelli di isolamento basati sul controllo delle versioni delle righe.