Condividi tramite


Stima delle dimensioni di un indice non cluster

È possibile attenersi alle indicazioni seguenti per stimare la quantità di spazio necessaria per archiviare un indice non cluster:

  1. Calcolare lo spazio utilizzato per archiviare informazioni sull'indice nei livelli non foglia dell'indice non cluster.
  2. Calcolare lo spazio utilizzato per archiviare informazioni sull'indice nel livello foglia dell'indice non cluster.
  3. Sommare i valori calcolati.

Passaggio 1. Calcolare lo spazio utilizzato per archiviare informazioni sull'indice nei livelli non foglia

ms190620.note(it-it,SQL.90).gifImportante:
Preservare i valori utilizzati in questo passaggio perché verranno utilizzati anche nel passaggio 2.

È possibile attenersi alle indicazioni seguenti per stimare la quantità di spazio necessaria per archiviare i livelli superiori dell'indice.

  1. Specificare il numero di righe che verranno incluse nella tabella:
    Num_Rows = numero di righe incluse nella tabella
  2. Specificare il numero di colonne a lunghezza fissa e a lunghezza variabile incluse nella chiave dell'indice e calcolare lo spazio necessario per archiviarle:
    Le colonne chiave di un indice possono includere le colonne a lunghezza fissa e quelle a lunghezza variabile. Per stimare le dimensioni della riga di indice di livello interno, calcolare lo spazio occupato da ciascun gruppo di colonne all'interno della riga di indice. Le dimensioni di una colonna dipendono dal tipo di dati e dalla lunghezza specificata. Per ulteriori informazioni, vedere Tipi di dati (Motore di database).
    Num_Key_Cols = numero totale di colonne chiave a lunghezza fissa e a lunghezza variabile
    Fixed_Key_Size = dimensione massima in byte di tutte le colonne chiave a lunghezza fissa
    Num_Variable_Key_Cols = numero delle colonne chiave a lunghezza variabile
    Max_Var_Key_Size = dimensione massima in byte di tutte le colonne chiave a lunghezza variabile
  3. Considerare anche l'indicatore di posizione delle righe di dati, necessario se l'indice non è univoco:
    Se l'indice non cluster non è univoco, l'indicatore di posizione delle righe di dati viene combinato con la chiave dell'indice non cluster in modo da ottenere un valore di chiave univoco per ciascuna riga.
    Se l'indice non cluster è su un heap, l'indicatore di posizione delle righe di dati corrisponde al RID dell'heap, le cui dimensioni sono pari a 8 byte.
    Num_Key_Cols = Num_Key_Cols + 1
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + 1
    Max_Var_Key_Size = Max_Var_Key_Size + 8
    Se l'indice non cluster è su un indice cluster, l'indicatore di posizione delle righe di dati corrisponde alla chiave di clustering. Le colonne da combinare con la chiave dell'indice non cluster sono le colonne della chiave di clustering non incluse già nel set di colonne chiave dell'indice non cluster.
    Num_Key_Cols = Num_Key_Cols + numero delle colonne chiave di cluster non nel set di colonne chiave di indice non cluster (+ 1 se l'indice cluster è non univoco)
    Fixed_Key_Size = Fixed_Key_Size + dimensioni totali in byte delle colonne chiave di cluster a lunghezza fissa non nel set di colonne chiave di indice non cluster
    Num_Variable_Key_Cols = Num_Variable_Key_Cols + numero delle colonne chiave di cluster a lunghezza variabile non nel set di colonne chiave di indice non cluster (+ 1 se l'indice cluster è non univoco)
    Max_Var_Key_Size = Max_Var_Key_Size + dimensione massima in byte delle colonne chiave di cluster a lunghezza variabile non nel set di colonne chiave di indice non cluster (+ 4 se l'indice cluster è non univoco)
  4. È possibile riservare parte della riga, nota come mappa di bit Null, per la gestione del supporto dei valori Null della colonna. Calcolarne le dimensioni:
    Se sono presenti colonne con valori Null nella chiave dell'indice, incluse le eventuali colonne chiave di clustering necessarie descritte al passaggio 1.3, parte della riga di indice viene riservata alla mappa di bit Null.
    Index_Null_Bitmap = 2 + ((numero di colonne chiave con valori null supportati + 7) / 8)
    Dovrebbe essere utilizzato solo l'integrale dell'espressione precedente. Eliminare le parti restanti.
    Se invece non sono disponibili colonne chiave con valori Null, impostare Index_Null_Bitmap su 0.
  5. Calcolare le dimensioni dei dati a lunghezza variabile:
    Se sono presenti colonne a lunghezza variabile nella chiave dell'indice, incluse eventuali colonne chiave dell'indice cluster necessarie, determinare lo spazio utilizzato per archiviare le colonne all'interno della riga di indice:
    Variable_Key_Size* = 2 + (Num_Variable_Key_Cols x 2) + *Max_Var_Key_Size Questa formula si basa sul presupposto che tutte le colonne di lunghezza variabile siano piene al 100%. Se si prevede una percentuale inferiore di utilizzo dello spazio di archiviazione delle colonne di lunghezza variabile, è possibile modificare il valore Max_Var_Key_Size in base a tale percentuale per ottenere una stima più precisa delle dimensioni complessive della tabella.
    Se non sono disponibili colonne a lunghezza variabile, impostare Variable_Key_Size su 0.
  6. Calcolare le dimensioni della riga di indice:
    Index_Row_Size = Fixed_Key_Size + Variable_Key_Size + Index_Null_Bitmap + 1 (per l'overhead dell'intestazione di una riga di indice) + 6 (per il puntatore ID della pagina figlio)
  7. Calcolare il numero di righe di indice per pagina (8096 byte liberi per pagina):
    Index_Rows_Per_Page = 8096 / (Index_Row_Size + 2)
    Poiché le righe di indice non si estendono su più pagine, il numero di righe di indice per pagina deve essere arrotondato alla riga completa più vicina. Il numero 2 nella formula si riferisce alla voce della riga nella matrice di slot della pagina.
  8. Calcolare il numero di livelli dell'indice:
    Levels = 1 + log Index_Rows_Per_Page (Num_Rows / Index_Rows_Per_Page)
    Si noti che questo valore non include il livello foglia dell'indice non cluster.
  9. Calcolare il numero di pagine dell'indice:
    Num_Index_Pages = ∑Level (Index_Rows_Per_Page)Level – 1
    dove 1 <= Level <= Levels
    A titolo di esempio si consideri un indice in cui il numero totale delle righe di indice necessarie a livello superiore a quello foglia è 1000 ed è possibile inserire 10 righe di indice per pagina. Per archiviare le 1000 righe, sono quindi necessarie 100 pagine. Nel livello successivo dell'indice devono invece essere archiviate 100 righe, pertanto sono necessarie 10 pagine. Nel livello finale dell'indice devono essere archiviate 10 righe, pertanto è necessaria una sola pagina. Utilizzando i numeri delle formule precedenti si otterrà quanto segue:
    Height = 1 + log10 (1000 / 10) = 3
    Num_Index_Pages = (10)3-1 + (10)2-1 + (10)1-1 = 111, che costituisce il numero delle pagine descritte nell'esempio.
  10. Calcolare le dimensioni dell'indice (8192 byte totali per pagina):
    Index_Space_Used* = 8192 x *Num_Index_Pages

Passaggio 2. Calcolare lo spazio utilizzato per archiviare informazioni sull'indice nel livello foglia

È possibile attenersi alle indicazioni seguenti per stimare la quantità di spazio necessaria per archiviare il livello foglia dell'indice. Per completare questo passaggio, sono necessari i valori preservati al passaggio 1.

  1. Specificare il numero di colonne a lunghezza fissa e a lunghezza variabile incluse a livello foglia e calcolare lo spazio necessario per archiviarle:

    [!NOTA] In SQL Server 2005 è possibile estendere un indice non cluster includendo colonne non chiave in aggiunta alle colonne chiave dell'indice. Tali colonne aggiuntive vengono archiviate solo al livello foglia dell'indice non cluster. Per ulteriori informazioni, vedere Creazione di indici con colonne incluse.

    [!NOTA] In SQL Server 2005 è possibile combinare colonne varchar, nvarchar, varbinary o sql_variant in modo che la larghezza totale definita della tabella superi 8.060 byte. La lunghezza di ciascuna colonna deve essere compresa nel limite di 8.000 byte per una colonna varchar, varbinary o sql_variant e di 4.000 byte per le colonne nvarchar. Le larghezze combinate di tali colonne possono tuttavia superare il limite di 8.060 byte in una tabella. Lo stesso vale inoltre per le righe foglia dell'indice non cluster che presentano colonne incluse. Per ulteriori informazioni, vedere Dati di overflow della riga che superano 8 KB.

    Se l'indice non cluster non dispone di colonne incluse, utilizzare i valori del passaggio 1, incluse le eventuali modifiche determinate al passaggio 1.3:
    Num_Leaf_Cols* = *Num_Key_Cols Fixed_Leaf_Size* = *Fixed_Key_Size Num_Variable_Leaf_Cols* = *Num_Variable_Key_Cols Max_Var_Leaf_Size* = *Max_Var_Key_Size Se l'indice non cluster dispone di colonne incluse, aggiungere i valori appropriati a quelli del passaggio 1, incluse le eventuali modifiche del passaggio 1.3. Le dimensioni di una colonna dipendono dal tipo di dati e dalla lunghezza specificata. Per ulteriori informazioni, vedere Tipi di dati (Motore di database).
    Num_Leaf_Cols = Num_Key_Cols + numero di colonne incluse
    Fixed_Leaf_Size = Fixed_Key_Size + dimensioni totali in byte delle colonne incluse a lunghezza fissa
    Num_Variable_Leaf_Cols = Num_Variable_Key_Cols + numero delle colonne incluse a lunghezza variabile
    Max_Var_Leaf_Size = Max_Var_Key_Size + dimensione massima in byte delle colonne incluse a lunghezza variabile

  2. Considerare l'indicatore di posizione delle righe di dati:
    Se l'indice non cluster non è univoco, l'overhead per l'indicatore di posizione delle righe di dati è già stato considerato al passaggio 1.3 e non sono richieste modifiche ulteriori. Procedere con il passaggio successivo.
    Se l'indice non cluster è univoco, è necessario considerare l'indicatore di posizione delle righe di dati per tutte le righe al livello foglia.
    Se l'indice non cluster è su un heap, l'indicatore di posizione delle righe di dati corrisponde al RID dell'heap, ovvero a 8 byte.
    Num_Leaf_Cols = Num_Leaf_Cols + 1
    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + 1
    Max_Var_Leaf_Size = Max_Var_Leaf_Size + 8
    Se l'indice non cluster è su un indice cluster, l'indicatore di posizione delle righe di dati corrisponde alla chiave di clustering. Le colonne da combinare con la chiave dell'indice non cluster sono le colonne della chiave di clustering non incluse già nel set di colonne chiave dell'indice non cluster.
    Num_Leaf_Cols = Num_Leaf_Cols + numero delle colonne chiave di cluster non nel set di colonne chiave di indice non cluster (+ 1 se l'indice cluster è non univoco)
    Fixed_Leaf_Size = Fixed_Leaf_Size + numero delle colonne chiave di cluster a lunghezza fissa non nel set di colonne chiave di indice non cluster
    Num_Variable_Leaf_Cols = Num_Variable_Leaf_Cols + numero delle colonne chiave di cluster a lunghezza variabile non nel set di colonne chiave di indice non cluster (+ 1 se l'indice cluster è non univoco)
    Max_Var_Leaf_Size = Max_Var_Leaf_Size + dimensione in byte delle colonne chiave di cluster a lunghezza variabile non nel set di colonne chiave di indice non cluster (+ 4 se l'indice cluster è non univoco)

  3. Calcolare le dimensioni della mappa di bit Null:
    Leaf_Null_Bitmap = 2 + ((Num_Leaf_Cols + 7) / 8)
    Dovrebbe essere utilizzato solo l'integrale dell'espressione precedente. Eliminare le parti restanti.

  4. Calcolare le dimensioni dei dati a lunghezza variabile:
    Se sono presenti colonne a lunghezza variabile nella chiave dell'indice, incluse eventuali colonne chiave di clustering necessarie descritte al passaggio 2.2, determinare lo spazio utilizzato per archiviare le colonne all'interno della riga di indice:
    Variable_Leaf_Size* = 2 + (Num_Variable_Leaf_Cols x 2) + *Max_Var_Leaf_Size Questa formula si basa sul presupposto che tutte le colonne di lunghezza variabile siano piene al 100%. Se si prevede una percentuale inferiore di utilizzo dello spazio di archiviazione delle colonne di lunghezza variabile, è possibile modificare il valore Max_Var_Leaf_Size in base a tale percentuale per ottenere una stima più precisa delle dimensioni complessive della tabella.
    Se non sono disponibili colonne a lunghezza variabile, impostare Variable_Leaf_Size su 0.

  5. Calcolare le dimensioni della riga di indice:
    Leaf_Row_Size = Fixed_Leaf_Size + Variable_Leaf_Size + Leaf_Null_Bitmap + 1 (per l'overhead dell'intestazione di una riga di indice) + 6 (per il puntatore ID della pagina figlio)

  6. Calcolare il numero di righe di indice per pagina (8096 byte liberi per pagina):
    Leaf_Rows_Per_Page = 8096 / (Leaf_Row_Size + 2)
    Poiché le righe di indice non si estendono su più pagine, il numero di righe di indice per pagina deve essere arrotondato alla riga completa più vicina. Il numero 2 nella formula si riferisce alla voce della riga nella matrice di slot della pagina.

  7. Calcolare il numero di righe libere riservate per pagina, sulla base del fattore di riempimento specificato:
    Free_Rows_Per_Page = 8096 x ((100 - Fill_Factor) / 100) / (Leaf_Row_Size + 2)
    Il fattore di riempimento utilizzato nel calcolo è un valore integer, non una percentuale. Poiché le righe non si estendono su più pagine, il numero di righe per pagina deve essere arrotondato alla riga completa più vicina. Aumentando il fattore di riempimento, in ciascuna pagina verrà archiviata una quantità maggiore di dati e il numero di pagine diminuirà. Il numero 2 nella formula si riferisce alla voce della riga nella matrice di slot della pagina.

  8. Calcolare il numero di pagine necessario per archiviare tutte le righe:
    Num_Leaf_Pages = Num_Rows / (Leaf_Rows_Per_Page - Free_Rows_Per_Page)
    Il numero di pagine stimato deve essere arrotondato alla pagina intera più vicina.

  9. Calcolare le dimensioni dell'indice (8192 byte totali per pagina):
    Leaf_Space_Used* = 8192 x *Num_Leaf_Pages

Passaggio 3. Sommare i valori calcolati

Sommare i valori ottenuti nei due passaggi precedenti:

Dimensioni dell'indice non cluster (byte) = Leaf_Space_Used + Index_Space_used

Nel calcolo non viene considerato quanto segue:

  • Partizionamento
    L'overhead di spazio derivante dal partizionamento è minimo, ma difficile da calcolare. Non è comunque importante includerlo.
  • Pagine di allocazione
    Per tenere traccia delle pagine allocate a un heap, esiste almeno una pagina IAM, tuttavia l'overhead di spazio è minimo e non esiste alcun algoritmo per calcolare in modo deterministico il numero esatto di pagine IAM che verranno utilizzate.
  • Valori LOB (Large Object)
    L'algoritmo per determinare con esattezza la quantità di spazio che verrà utilizzata per archiviare i tipi di dati LOB varchar(max), varbinary(max), nvarchar(max), text, ntext, xml e i valori image è complesso. È comunque sufficiente aggiungere le dimensioni medie dei valori LOB previsti, moltiplicarle per Num_Rows e aggiungere il prodotto alle dimensioni totali dell'indice non cluster.

Vedere anche

Concetti

Linee guida per la progettazione di indici cluster
Creazione di indici (Motore di database)
Linee guida per la progettazione di un indice non cluster
Stima delle dimensioni di una tabella
Stima delle dimensioni di un indice cluster
Stima delle dimensioni di un heap

Altre risorse

Stima delle dimensioni di un database

Guida in linea e informazioni

Assistenza su SQL Server 2005