Il tempo di ricostruzione dell'indice dipende dal livello di frammentazione?


8

Il tempo richiesto per la ricostruzione dell'indice dipende dal livello di frammentazione?

La ricostruzione di un indice frammentato all'80% richiede circa 2 minuti se la ricostruzione dello stesso indice frammentato al 40% richiede 1 minuto?

Sto chiedendo il RUNTIME (ad esempio in secondi) che potrebbe essere necessario per eseguire l'azione richiesta, non su quale azione è richiesta in quale particolare situazione. Sono a conoscenza delle migliori pratiche di base quando è necessario eseguire il reorg dell'indice o gli aggiornamenti di ricostruzione / statistica.

Questa domanda NON pone su REORG e la differenza tra REORG e REBUILD.

Sullo sfondo: a causa della configurazione di diversi lavori di manutenzione degli indici (ogni notte, lavoro più pesante durante i fine settimana ...) Mi chiedevo se un lavoro di manutenzione dell'indice OFFLINE "leggero intenso" giornaliero dovrebbe essere eseguito meglio su indici frammentati medio-bassi per mantenere il tempi di inattività piccoli - o non importa nemmeno e la ricostruzione su un indice frammentato dell'80% potrebbe richiedere lo stesso tempo di inattività della stessa operazione sullo stesso indice frammentato al 40%.

Ho seguito i suggerimenti e ho cercato di scoprire cosa stesse succedendo. La mia configurazione sperimentale: su un server di prova che non fa NIENTE e non viene utilizzato da nessuno o altro, ho creato una tabella con un indice cluster su una colonna chiave primaria dell'identificatore univoco con alcune colonne aggiuntive e diversi tipi di dati [2 numeri, 9 datetime e 2 varchar (1000)] e righe semplicemente aggiunte. Per il test presentato ho aggiunto circa 305.000 righe.

Quindi ho usato un comando di aggiornamento e ho aggiornato casualmente un intervallo di filtri di righe su un valore intero e ho modificato una delle colonne VarChar con un valore stringa variabile per creare la frammentazione. Dopo di che ho controllato il avg_fragmentation_in_percentlivello attuale in sys.dm_db_index_physical_stats. Ogni volta che ho creato una "nuova" frammentazione per il mio benchmark, ho aggiunto questo valore incluso il physical_page_countvalore alle mie registrazioni di cui è composto il diagramma seguente.

Poi ho corso: Alter index ... Rebuild with (online=on); e l' ho afferrato CPU timeusando STATISTICS TIME ONnelle mie registrazioni.

Le mie aspettative: mi aspettavo di vedere almeno l'indicazione di una sorta di curva lineare che mostra una dipendenza tra livello di frammentazione e tempo della CPU.

Questo non è il caso. Non sono sicuro che questa procedura sia davvero appropriata per un buon risultato. Forse il numero di righe / pagine è troppo basso?

Tuttavia, i risultati indicano che la risposta alla mia domanda originale sarebbe sicuramente NO . Sembra che il tempo richiesto per la CPU sia necessario a SQL Server per ricostruire l'indice non dipende né dal livello di frammentazione né dal conteggio delle pagine dell'indice sottostante.

Il primo grafico mostra il tempo della CPU richiesto per RICOSTRUIRE l'indice rispetto al livello di frammentazione precedente. Come puoi vedere, la linea media è una costante relativa e non è affatto osservabile una relazione tra frammentazione e tempo richiesto della cpu.

Per rispettare la possibile influenza del numero variabile di pagine nell'indice dopo i miei aggiornamenti che potrebbero richiedere più o meno tempo per la ricostruzione, ho calcolato LIVELLO DI FRAGMENTAZIONE * CONTEGGIO PAGINE e ho usato questo valore nel secondo grafico che mostra la relazione del tempo cpu richiesto vs. frammentazione e conteggio delle pagine.

Frammentazione dell'indice e ricostruzione delle statistiche sul tempo della CPU

Come puoi vedere, anche questo non indica che il tempo richiesto per la ricostruzione è influenzato dalla frammentazione anche se il numero di pagine varia.

Dopo aver fatto queste affermazioni suppongo che la mia procedura debba essere sbagliata perché il tempo della CPU richiesto per ricostruire un indice enorme e altamente frammentato potrebbe essere influenzato solo dal numero di righe - e non credo davvero in questa teoria.

Quindi, dato che voglio davvero e sicuramente scoprirlo ora, ulteriori commenti e raccomandazioni sono i benvenuti .

Risposte:


2

Il tempo richiesto per la ricostruzione dell'indice dipende dal livello di frammentazione?

Credo che questo non sarà il parametro principale su cui deciderà SQL Server e richiede tempo per ricostruire \ riorganizzare l'indice:

Ci sono vari altri fattori coinvolti in base a "DATI" attraverso i quali decide per quanto tempo ci vorrà: parametri come

Fattore 1: dimensioni della tabella

Fattore 2: preoccupazioni di disponibilità

Fattore 3: partizionamento

Fattore 4: colonne indice e unicità

Se vuoi leggere di più su questi fattori puoi fare riferimento qui .

La ricostruzione di un indice frammentato all'80% richiede circa 2 minuti se la ricostruzione dello stesso indice frammentato al 40% richiede 1 minuto

Ancora una volta la risposta può essere Dipende! Per i numeri dovrai testare lo scenario e vedere gli output come va. Tieni traccia di tali dettagli come per FRAG livello 80, la ricostruzione ha richiesto X ore \ mins \ sec e per Frag livello 40, la ricostruzione ha impiegato Y ore \ mins \ sec. Calcola e conserva la cronologia per più di 15 giorni (dipende dall'attività di manutenzione programmata) e potresti giungere a una conclusione su quanto tempo impiega effettivamente a confrontare entrambi.

Inoltre:

È possibile raccogliere i dati \ calcolo sull'avanzamento della ricostruzione dell'indice:

utilizzando DMV sys.dm_exec_requests OPPURE

Se disponi dei piani di manutenzione di Ola per la reindicizzazione e la riorganizzazione, esiste un'opzione per salvare la cronologia delle azioni eseguite durante la manutenzione all'interno della tabella CommandLog, come spiegato in SQL Server Index and Statistics Maintenance . Una volta salvati i dati, è possibile eseguire una query per il tipo di comando `ALTER_INDEX - REBUILD 'e la differenza per lo stesso tra le colonne START TIME e END TIME


@KASQLDBA Sono andato nelle statistiche / nel registro della tabella CommandLog di Ola. La durata è molto casuale e non vi è alcuna relazione con il livello di frammentazione riconoscibile. Dato che ho quei valori solo su un ambiente di produzione, il tempo necessario per la ricostruzione potrebbe essere influenzato molto da altri processi, quindi questo non sembra fornire una risposta generale.
Magier,

8

Per tutti gli interessati, ho creato un grafico che mostra l'indice REBUILD durata di circa 2500 ricostruzioni dell'indice entro un paio di settimane in relazione alla frammentazione dell'indice e alle sue dimensioni in pagine.

Questi dati si basano su 10 server SQL, centinaia di tabelle e sulle procedure di ottimizzazione di Ola Hallengren . La soglia generale per la ricostruzione è impostata su una frammentazione del 5%.

Ho tagliato alcune delle tabelle più grandi (10 Mi + Pagine) in queste statistiche per renderle più leggibili.

Il grafico mostra il tempo richiesto (durata) come dimensione delle bolle. I valori della bolla più grande sono circa 220 secondi. Mostra che il tempo richiesto per ricostruire un indice non è realmente correlato alla frammentazione. Invece sembra essere più dipendente dal numero di pagine dell'indice. Inoltre indica che la frammentazione di basso livello richiede più tempo rispetto alla frammentazione più elevata. Durata della ricostruzione dell'indice

Il secondo grafico viene appena ingrandito nell'area <= 200 K pagine. Mostra lo stesso, impiega più tempo per gli indici più grandi, non per una maggiore frammentazione. inserisci qui la descrizione dell'immagine


6

REBUILDdell'indice non dipende dalla frammentazione. Elimina completamente l'indice e lo crea da zero.

REORGANZE indice: serve per ridurre la frammentazione senza la ricostruzione dell'indice, quindi non rilasciare e creare.

MS consiglia di utilizzare Riorganizza per una frammentazione del 30% o inferiore. Per una frammentazione più elevata è preferibile la ricostruzione.

Ecco l'articolo MSDN su questo: riorganizzazione e ricostruzione degli indici

AGGIORNARE

In termini di tempo impiegato per completare l'operazione, dipende ovviamente dalla frammentazione dell'indice. La ricostruzione di un indice estremamente frammentato richiederà meno tempo della riorganizzazione; la ricostruzione di un indice leggermente frammentato richiederà molto più tempo. Suggerirei di prendere le linee guida per la SM come punto di partenza e di eseguire alcuni test sui tuoi tavoli. Il punto di pareggio in termini di frammentazione% dipenderà dalla tabella specifica, dalla dimensione dell'indice e dal tipo di dati.


4

La ricostruzione di un indice frammentato all'80% richiede circa 2 minuti se la ricostruzione dello stesso indice frammentato al 40% richiede 1 minuto?

L'algoritmo per REBUILD vs REORG è diverso. Un REORG NON ​​assegnerà nuove estensioni invece di un REVISIONATO. Un REORG funzionerà con le pagine attualmente allocate (alloca una pagina casuale da 8Kb in modo che possa spostare le pagine) e le sposta in giro, quindi se necessario spostare le pagine.

Dalle mie note interne di SQLSkills (precedentemente IE0) ....

Per REVISIONATO:

  • Può usare più CPU - può sfruttare il parallelismo per fare il lavoro velocemente.
  • Per indici fortemente frammentati (ad es. 80% come nel tuo esempio), un REVISION sarà molto più veloce di un REORG. REBUILD creerà semplicemente un'altra copia dell'indice, mentre REORG si impantanerà nel rimuovere la frammentazione e quindi sarà più lento. Questo è il motivo per cui Paul Randal ha dato la sua raccomandazione generale che sarebbe bene fare un RICOSTRUZIONE di un indice fortemente frammentato.
  • Un REBUILD ti consentirà di modificare la modalità di ripristino in BULK_LOGGED per una registrazione minima lì generando meno record di registro .

Per Index REORG:

  • È sempre a thread singolo. Nessun parallelismo.
  • È più lento per gli indici fortemente frammentati e più veloce per gli indici leggermente frammentati. Il costo di creazione di un indice rispetto a un rimbalzo di un indice leggermente frammentato è maggiore e quindi un REORG sarà più veloce per un indice leggermente frammentato.
  • Un REORG è sempre un'operazione completamente registrata.

Continua a leggere - Note - Frammentazione, tipi e soluzioni dell'indice di SQL Server


Kin, TY per il tuo commento, ma sento che hai supervisionato il nucleo della mia domanda. Stai confrontando reorg vs ricostruisci. Ho chiesto un confronto tra ricostruisci e ricostruisci per diversi livelli di frammentazione (ceteris paribus).
Magier,

@Magier se rileggi attentamente la mia risposta, risponde alla tua domanda principale - se un indice è fortemente frammentato, ricostruiscilo. Il costo di fare una ricostruzione di un frammentato leggermente è molto più che fare un rimorso. Inoltre, non esiste un modo giusto o sbagliato di affrontare la frammentazione eseguendo una ricostruzione o un reorg, tutto dipende dalla disponibilità del sistema, dai dati, dalle dimensioni dell'indice, dal sottosistema IO del disco, ecc. Inoltre è possibile eseguire facilmente alcuni test secondo l'ambiente per confrontare ricostruisci con ricostruisci per diversi livelli di frammentazione. Non puoi
Kin Shah,

Non ho mai chiesto o menzionato REORG. Si tratta di REBUILD. E, sì, sono sicuro di poter impostare i test e provare a creare livelli di frammentazione specifici per scoprire quanto tempo richiederà la ricostruzione, ma volevo vedere se qualcuno già lo sa e può dirmi solo i risultati attesi di tale approccio.
Magier,


0

Sì, perché in genere una ricostruzione deve scansionare l'indice originale in ordine mentre si esegue lo streaming delle righe (in ordine) in una nuova partizione dell'indice fisico. La frammentazione danneggia scansioni non memorizzate, quindi sì, la ricostruzione richiederà più tempo.

Quanto più a lungo dipende dalla frammentazione e da come la CPU è legata all'intero processo. La serializzazione delle righe richiede molta CPU, quindi potrebbe non avere alcuna importanza. In alternativa, potresti ottenere frequenze IO casuali in genere di 1,5 MB / sec, che è facilmente 5-10 volte più lenta di una ricostruzione veloce (dipende dallo schema e dai dati). A seconda delle ipotesi che fai, puoi probabilmente inventare qualsiasi cosa tra il rallentamento 1x e 100x.

La ricostruzione di un indice frammentato all'80% richiede circa 2 minuti se la ricostruzione dello stesso indice frammentato al 40% richiede 1 minuto?

Non è una relazione lineare. La metrica di frammentazione è un proxy molto approssimativo per quanto tempo impiega a scansionare una partizione.


@Magier buona ricerca. Il tempo di CPU non è mai influenzato dalla frammentazione. Stai testando piccole tabelle che sono completamente memorizzate nella cache in modo che non vi sia alcuna lettura IO. Il test non è valido. Prova con tabelle più grandi (come 100 MB) e fai CHECKPOINT; DBCC DROPCLEANBUFFERSprima di ogni prova. Sono interessato anche a vedere i risultati. Una volta ho fatto un test simile in cui ho misurato la velocità di scansione in base alla frammentazione, ma non ricordo il risultato.
usr

Inoltre, tieni presente che il numero di frammentazione è una specie di indicatore lento perché ciò che conta davvero è il movimento fisico della testa del disco. Posso immaginare molti pattern IO che sono ragionevolmente veloci ma con una frammentazione del 100% misurata da SQL Server usando la sua definizione ristretta. Ad esempio, il modello di allocazione 1_2_3_4 in cui 1-4 viene scansionato e _ è un buco dovrebbe essere veloce.
usr

che valore devo esattamente guardare allora? In realtà ottengo le seguenti informazioni da Rebuild: tempo CPU = 0 ms, tempo trascorso = 70 ms. Tabella 'tFrag2'. Conteggio scansioni 4, letture logiche 512067, letture fisiche 26, letture read-ahead 71209, letture logiche lob 0, letture fisiche lob 0, letture read-ahead lob 0. Tempi di esecuzione di SQL Server: tempo CPU = 8657 ms, tempo trascorso = 27246 SM. Tempi di esecuzione di SQL Server: tempo CPU = 8657 ms, tempo trascorso = 27386 ms.
Magier,

Sono questi tempi da 3 domande? È un po 'confuso. Dai primi numeri puoi dire che molti dati sono memorizzati nella cache. Anche 70ms è troppo corto per un benchmark valido. Puoi chiarire cosa rappresentano quei numeri?
usr

Le volte che ho menzionato sono arrivate da STATISTICS_TIME e STATISTICS_IO. Ho intenzione di riavviare un nuovo benchmark in questo momento e questa volta voglio ottenere risultati adeguati. Quindi eventuali ulteriori suggerimenti sono i benvenuti. Non capisco cosa aiuta a pulire la cache dei dati poiché sono interessato a recuperare i dati velocemente ma ricostruendo l'indice, cosa deve essere fatto comunque su disco?
Magier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.