La frammentazione dell'indice di SQL Server è una fonte comune di degrado delle prestazioni del database. La frammentazione si verifica quando c'è molto spazio vuoto su una pagina di dati (frammentazione interna) o quando l'ordine logico delle pagine nell'indice non corrisponde all'ordine fisico delle pagine nel file di dati (frammentazione esterna).
I problemi di prestazioni relativi alla frammentazione si verificano più spesso durante l'esecuzione di query che eseguono scansioni di indici. Le query che eseguono ricerche di indice potrebbero non essere interessate dalla frammentazione dell'indice elevato.
Informazioni sui tipi di frammentazione dell'indice di SQL Server
Frammentazione dell'indice interno
La frammentazione interna si verifica quando le pagine di dati hanno troppo spazio libero. Questo spazio extra viene introdotto attraverso alcune strade diverse:
- SQL Server archivia i dati su pagine da 8 KB. Quindi, quando inserisci meno di 8 KB di dati in una tabella, rimani con uno spazio vuoto nella pagina.
- Al contrario, se inserisci più dati di quanti ne ha lo spazio per la pagina, l'eccesso viene inviato a un'altra pagina. È improbabile che i dati aggiuntivi riempiano perfettamente le pagine successive, quindi, ancora una volta, rimani con uno spazio vuoto su una pagina.
- Lo spazio vuoto su una pagina di dati si verifica anche quando i dati vengono eliminati da una tabella.
La frammentazione interna causa principalmente problemi di prestazioni quando SQL Server esegue un'analisi dell'indice. Le prestazioni rallentano quando SQL Server deve eseguire la scansione di molte pagine parzialmente riempite per trovare i dati che sta cercando.
Frammentazione dell'indice esterno
La frammentazione esterna è il risultato di pagine di dati fuori servizio. Ciò è causato dall'inserimento o dall'aggiornamento di dati in pagine a foglia intera. Quando i dati vengono aggiunti a una pagina intera, SQL Server crea una divisione di pagina per accogliere i dati aggiuntivi e la nuova pagina viene separata dalla pagina originale.
La frammentazione esterna causa problemi di prestazioni aumentando l'I/O casuale. Quando le pagine non sono sequenziali, SQL Server deve leggere i dati da più posizioni, il che richiede più tempo rispetto alla lettura in ordine.
Come evitare la frammentazione dell'indice di SQL Server
Non è possibile impedire completamente la frammentazione dell'indice, ma esistono modi per ridurne al minimo l'occorrenza e ridurre l'effetto della frammentazione sulle prestazioni del database. Ecco alcune cose da fare e da non fare per evitare la frammentazione dell'indice di SQL Server:
FAI: Scegli le chiavi del cluster che sono valori in costante aumento o valori in costante diminuzione. Ciò ridurrà le divisioni di pagina perché quando si inseriscono record, verranno inseriti all'inizio o alla fine della catena di pagine logica.
NON: Inserisci record con valori chiave casuali. Scegli valori chiave statici in modo che una volta posizionato un record, non dovrà mai spostarsi e non andrà fuori ordine.
NON: Aggiorna i record per allungarli. L'aggiunta di record a un indice durante un aggiornamento può richiedere che SQL Server esegua il push di alcuni dati in una nuova pagina. Ciò può causare pagine foglia non sequenziali e, infine, problemi di prestazioni.
NON: Aggiorna le colonne della chiave dell'indice. Gli aggiornamenti delle colonne chiave richiedono un'eliminazione completa della riga seguita da un inserimento della riga intera utilizzando il nuovo valore della chiave. Se la nuova riga viene inserita in una pagina senza spazio sufficiente, otterrai una divisione della pagina.
FAI: Fai attenzione alle funzionalità che possono causare divisioni di pagina. Tieni presente i potenziali risultati finali della modifica di qualsiasi funzionalità che coinvolge gli indici. Ad esempio, l'aggiornamento di colonne a larghezza variabile (anche in colonne non chiave) in un indice cluster può causare la divisione delle pagine.
FAI: Implementare fattori di riempimento dell'indice appropriati. Analizzare la frammentazione con l'impostazione predefinita del fattore di riempimento e regolarla secondo necessità per ridurre al minimo la frammentazione eccessiva a carico normale.
Come risolvere la frammentazione dell'indice di SQL Server
Poiché è impossibile prevenire la frammentazione il 100% delle volte, è importante sapere come correggere la frammentazione dell'indice di SQL Server se le prestazioni peggiorano.
Prima di poter decidere come affrontare il problema di frammentazione dell'indice di SQL Server, devi prima determinare l'entità del problema che stai affrontando.
Il miglior punto di partenza è utilizzare il DMF sys.dm_db_index_physical_stats per analizzare il livello di frammentazione dei tuoi indici. Una volta che sai quanto è estesa la frammentazione dell'indice, puoi tracciare il tuo piano di attacco con una delle tre soluzioni:ricostruire l'indice, riorganizzare l'indice o non fare nulla.
Ricostruisci: Ricostruisci gli indici quando la frammentazione supera il 30 percento.
Riorganizza: Riorganizza gli indici con una frammentazione compresa tra l'11 e il 30 percento.
Ignora: Livelli di frammentazione del 10 percento o meno non dovrebbero rappresentare un problema di prestazioni, quindi non devi fare nulla.
La frammentazione dell'indice di SQL Server è inevitabile, ma è possibile ridurre al minimo gli effetti negativi della frammentazione sulle prestazioni del database. Segui alcune semplici best practice e mantieniti aggiornato sulla manutenzione programmata per mitigare eventuali problemi di prestazioni importanti legati alla frammentazione.