So che ci sono davvero tre tipi di frammentazione di cui devo preoccuparmi come DBA:
Frammentazione dell'indice nei file di dati SQL, inclusa la frammentazione dell'indice cluster (tabella). Identificarlo usando DBCC SHOWCONTIG (in SQL 2000) o sys.dm_ db_ index_ physical_ stats (nel 2005+).
Frammentazione VLF all'interno dei file di registro SQL. Eseguire DBCC LOGINFO per vedere quanti VLF sono presenti in ciascuno dei file di registro SQL.
Frammentazione dei file fisici dei file di database sul disco rigido. Diagnosticare ciò utilizzando l'utilità "Utilità di deframmentazione dischi" in Windows. (ispirato a questo eccellente post sul blog )
Molta attenzione è rivolta alla frammentazione dell'indice (vedi questa eccellente risposta Serverfault di Paul Randall), quindi non è questo il fulcro della mia domanda.
So di poter prevenire la frammentazione fisica (e la frammentazione VLF) quando il database è stato originariamente creato pianificando un file di dati e una dimensione logici previsti ragionevoli, poiché questa frammentazione si verifica più spesso a causa di crescite e riduzioni frequenti, ma ho alcune domande su come risolvere frammentazione fisica una volta identificata:
Prima di tutto, la frammentazione fisica è rilevante anche in una SAN Enterprise? Posso / dovrei usare l'utilità di deframmentazione di Windows su un'unità SAN o il team SAN dovrebbe utilizzare le utilità di deframmentazione interne? L'analisi di frammentazione che ottengo dallo strumento Windows è accurata anche quando eseguita su un'unità SAN?
Quanto è grande la frammentazione fisica delle prestazioni SQL? (Supponiamo un array di unità interne, in attesa dell'esito della domanda precedente.) È un affare PIÙ GRANDE della frammentazione dell'indice interno? O è davvero lo stesso tipo di problema (l'unità deve fare letture casuali invece di letture sequenziali)
La deframmentazione (o la ricostruzione) degli indici è una perdita di tempo se l'unità è fisicamente frammentata? Devo riparare l'uno prima di rivolgermi all'altro?
Qual è il modo migliore per correggere la frammentazione dei file fisici su una casella SQL di produzione? So che posso disattivare i servizi SQL ed eseguire Defrag di Windows, ma ho anche sentito parlare di una tecnica in cui si esegue un backup completo, si elimina il database, quindi si ripristina dal backup su un'unità vuota. Quest'ultima tecnica è consigliata? Il ripristino da un backup come questo crea anche indici da zero, eliminando la frammentazione degli indici interni? Oppure restituisce semplicemente l'ordine delle pagine allo stesso modo in cui è stato eseguito il backup? (Stiamo usando i backup di Quest Lightspeed con compressione, se questo è importante.)
AGGIORNAMENTO : Finora buone risposte sull'opportunità di deframmentare le unità SAN (NO) e se la deframmentazione dell'indice vale ancora su unità fisicamente frammentate (SÌ).
Qualcun altro si preoccupa di valutare i metodi migliori per eseguire effettivamente la deframmentazione? O una stima del tempo che ti aspetteresti sarebbe necessario per deframmentare un disco frammentato di grandi dimensioni, diciamo circa 500 GB? Rilevante, ovviamente, perché quello è il momento in cui il mio server SQL sarà inattivo!
Inoltre, se qualcuno ha qualche informazione aneddotica sui miglioramenti delle prestazioni di SQL che hai apportato correggendo la frammentazione fisica, sarebbe fantastico. Il post sul blog di Mike parla della scoperta del problema, ma non è specifico del tipo di miglioramento che ha apportato.