Innanzitutto, è importante considerare se la frammentazione è importante.
Se la query esegue solo ricerche a riga singola, potresti non notare affatto la frammentazione. Nelle moderne SAN, la memorizzazione nella cache a livello di SAN può rendere gli IO fitologici abbastanza veloci da non importare la frammentazione. Su SSD, il modello I / O casuale causato dalla scansione di un indice frammentato può effettivamente comportare prestazioni migliori rispetto ai dati non frammentati.
Spesso, le persone notano che la riqualificazione di un indice ha risolto un problema di prestazioni. La ricostruzione di un indice crea anche nuove statistiche. Può darsi che la vera correzione siano nuove statistiche, non la ricostruzione dell'indice. UPDATE STATISTICS...WITH FULLSCAN
può essere un modo più economico, più veloce e meno invadente per risolvere lo stesso problema di prestazioni.
Se non si verificano problemi causati dalla frammentazione, è possibile che si impieghi tempo e sforzi significativi senza ottenere alcun guadagno effettivo.
In secondo luogo, ci sono due tipi di frammentazione:
Frammentazione fisica. Questo è ciò che la maggior parte delle persone pensa quando pensa alla frammentazione. Le pagine sono fuori servizio e devono essere riordinate. Durante la scansione di un indice questo tipo di frammentazione può talvolta rappresentare un problema. In genere ho notato che questo ha il maggiore impatto sulle prestazioni con letture fisiche . Se stai guardando i risultati da sys.dm_db_index_physical_stats
, questo numero è la avg_fragmentation_in_percent
colonna.
Frammentazione a bassa densità. Questa frammentazione è causata da pagine riempite solo parzialmente di dati. Hai una bassa densità di dati perché i tuoi dati sono distribuiti su più pagine del necessario. Di conseguenza, la lettura dei dati richiede più IO perché i dati sono distribuiti su più pagine del necessario. Ciò può influire su letture sia logiche che fisiche. Se stai guardando i risultati da sys.dm_db_index_physical_stats
, questo numero è la avg_page_space_used_in_percent
colonna. Questa colonna viene popolata solo quando si utilizza la modalità SAMPLED
o DETAILED
.
Quindi cosa fai al riguardo:
Frammentazione fisica : se stai semplicemente inseguendo numeri elevati avg_fragmentation_in_percent
, considera davvero se stai perdendo tempo. Assicurarsi di disporre di una query effettiva con prestazioni scarse e utilizzare un ambiente di test per confermare che si sta risolvendo un problema eliminando la frammentazione.
Puoi affrontare la frammentazione fisica facendo ALTER INDEX...REORGANIZE
. L' REORGANIZE
operazione è online, spostando le pagine una alla volta per riorganizzarle in ordine fisico. Se si interrompe REORGANIZE
un'istruzione a metà strada, qualsiasi lavoro che è già stato eseguito viene mantenuto: verrà eseguito il rollback solo dell'unica pagina attualmente spostata. Esecuzione di operazioni REORGANIZE
su una tabella di grandi dimensioni altamente frammentata può richiedere più spazio per il registro delle transazioni e, in modalità di ripristino completo, può generare una quantità significativa di backup del registro delle transazioni. Potrebbe anche richiedere più tempo per REORGANIZE
un indice altamente frammentato che per REBUILD
esso.
Vedrai spesso consigli per eseguire un REBUILD
su indici altamente frammentati, piuttosto che un REORGANIZE
- Questo perché la ricostruzione da zero può essere più efficiente. Tuttavia, la riorganizzazione può essere un'operazione "più online" ed è talvolta preferita, anche per indici altamente frammentati.
La frammentazione a bassa densità non può essere riparata da REORGANIZE
. Può essere risolto solo facendo un ALTER INDEX...REBUILD
. Eseguendo l'indice con ONLINE=ON
, dovresti essere in grado di ridurre al minimo il blocco. Tuttavia, è REBUILD
ancora necessario bloccare un attimo per scambiare il vecchio indice con il nuovo indice. Su un sistema molto occupato, il raggiungimento di questo blocco esclusivo a volte può essere un problema. Dovresti essere in grado di confermare se stai riscontrando questo problema usando qualcosa come sp_whoisactive per esaminare il blocco durante la ricostruzione e guardare i dettagli dei blocchi e delle attese. L'uso WAIT_AT_LOW_PRIORITY
dell'opzione può essere utile se sai che ci sarà un prossimo periodo di scarso utilizzo e la tua ricostruzione può "intrufolarsi" per questo scambio quando l'attività scende abbastanza da raggiungere quel blocco. Si noti che una lunga durataREBUILD
l'operazione sarà anche una transazione aperta a lungo termine. Le transazioni aperte a lungo termine possono avere i loro problemi, legate all'uso / al riutilizzo del registro delle transazioni. Se si utilizza il mirroring o i gruppi di disponibilità, ci sono anche considerazioni per ripetere il registro delle transazioni nella replica secondaria.
REORGANIZE
ridurrà la frammentazione delle pagine fogliari e lo spazio compatto comeREBUILD
, in modo meno efficiente. Sei sicuro che le grandi dimensioni siano dovute alla frammentazione? Qual è il fattore di riempimento?