Fattore di riempimento

L'opzione del fattore di riempimento viene fornita per ottimizzare l'archiviazione dati e le prestazioni degli indici. Quando si crea o si ricostruisce un indice, il valore del fattore di riempimento determina la percentuale di spazio in ogni pagina al livello foglia da riempire di dati, riservando lo spazio rimanente in ogni pagina come spazio libero per la crescita futura. Se ad esempio si specifica un fattore di riempimento pari a 80, significa che il 20% di ogni pagina al livello foglia verrà lasciato vuoto, rendendo disponibile lo spazio per l'espansione dell'indice con l'aggiunta di dati alla tabella sottostante. Lo spazio vuoto viene riservato tra le righe anziché alla fine dell'indice.

Il valore del fattore di riempimento è una percentuale compresa tra 1 e 100 e l'impostazione predefinita a livello di server è 0. Questo significa che le pagine al livello foglia vengono riempite completamente.

Nota

I valori 0 e 100 del fattore di riempimento sono equivalenti.

È possibile utilizzare l'istruzione CREATE INDEX o ALTER INDEX per impostare il valore del fattore di riempimento per singoli indici. Per modificare il valore predefinito a livello di server, utilizzare la stored procedure di sistema sp_configure. Per visualizzare il valore del fattore di riempimento per uno o più indici, utilizzare sys.indexes.

Nota importanteImportante

L'impostazione del fattore di riempimento si applica solo durante la creazione o la ricostruzione dell'indice. In Motore di database di SQL Server la percentuale specificata di spazio vuoto delle pagine non viene mantenuta in modo dinamico. Se si tenta di mantenere lo spazio aggiuntivo nelle pagine di dati, si vanificano i motivi iniziali per cui è stato utilizzato il fattore di riempimento, in quanto il Motore di database deve eseguire divisioni di pagina per mantenere la percentuale di spazio libero specificata da tale fattore in ogni pagina quando vengono immessi i dati.

Considerazioni sulle prestazioni

Divisioni di pagina

Un valore del fattore di riempimento scelto correttamente consente di ridurre le potenziali divisioni di pagina rendendo disponibile uno spazio sufficiente per l'espansione dell'indice con l'aggiunta di dati alla tabella sottostante. Quando viene aggiunta una nuova riga a una pagina di indice completa, il Motore di database sposta circa la metà delle righe in una nuova pagina per lasciare spazio per la nuova riga. Questa riorganizzazione è denominata divisione di pagina. Una divisione di pagina consente di creare spazio per nuovi record, ma può richiedere una certa quantità di tempo e un elevato utilizzo di risorse. Può inoltre provocare la frammentazione, che a sua volta causa l'aumento delle operazioni di I/O. Quando si verificano frequenti divisioni di pagina, l'indice può essere ricostruito utilizzando un valore del fattore di riempimento nuovo o esistente per ridistribuire i dati. Per ulteriori informazioni, vedere Riorganizzazione e ricompilazione degli indici.

Benché un valore del fattore di riempimento basso e diverso da 0 può ridurre la necessità di dividere le pagine con l'aumento delle dimensioni dell'indice, l'indice richiederà uno spazio di archiviazione maggiore, con possibili effetti negativi sulle prestazioni di lettura. Anche per un'applicazione progettata per il supporto di numerose operazioni di inserimento e aggiornamento, il numero di letture nel database è in genere maggiore del numero di scritture in base a un fattore di 5 a 11. Se pertanto si specifica un fattore di riempimento diverso dal valore predefinito, è possibile che le prestazioni di lettura del database risultino ridotte in misura inversamente proporzionale all'impostazione del fattore di riempimento. Un valore del fattore di riempimento pari a 50 può ad esempio dimezzare le prestazioni di lettura del database. Ciò avviene perché l'indice contiene più pagine, aumentando pertanto le operazioni di I/O su disco necessarie per recuperare i dati.

Aggiunta di dati alla fine della tabella

Un valore del fattore di riempimento diverso da 0 o 100 può risultare efficace per le prestazioni se i nuovi dati vengono distribuiti uniformemente in tutta la tabella. Se tuttavia tutti i dati vengono aggiunti alla fine della tabella, lo spazio vuoto nelle pagine di indice non verrà riempito. Se ad esempio la colonna chiave dell'indice è una colonna IDENTITY, la chiave per le nuove righe aumenta di continuo e le righe di indice vengono aggiunte logicamente alla fine dell'indice. Se le righe esistenti verranno aggiornate con dati che ne aumentano le dimensioni, utilizzare un fattore di riempimento minore di 100. I byte aggiuntivi in ogni pagina consentiranno di ridurre le divisioni di pagina causate dalla maggiore lunghezza delle righe.