1016giorni trascorsi da
SQLBits 9

powered by

Progetti‎ > ‎

Index Maintenance


Obiettivi
  • deframmentare gli indici clustered e non-clustered di un database in funzione di seguenti fattori:
    • livello di frammentazione;
    • dimensione dell'indice (espresso in numero di pagine di dati);
    • presenza di una colonna identity nell'indice (come prima colonna in caso di indice composito)
  • registrare in tabelle di log, lo stato di frammentazione prima e dopo l'avvenuta deframmentazione


Per iniziare

Per comprendere i concetti fondamentali sull'oggetto di questo progetto, ti consiglio la lettura dei seguenti articoli:

Contenuti

La soluzione è composta di 3 script, di cui il primo è preliminare per gli altri 2.
  • 00.ind_maint__setup
    • crea il database [support_dba] e al suo interno le tabelle di log [stat].[index_rebuild] e [stat].[index_reorganize], e la funzione dbo.fn_MVParam().
  • 02.ind_maint_rebuild
    • lanciata nel contesto di un database ne ricostruisce gli indici in funzione delle seguenti variabili:
 nome variabile tipodefault significato
@min_page_count int 1000numero minimo di pagine di dati di cui deve essere costituito un indice per essere ricostruito
@min_avg_fragmentation_in_percent int 30soglia minima di frammentazione   (in percentuale) che deve avere un indice per essere ricostruito
@is_rebuild_on_line bit 00 = non ONLINE
1 = ONLINE
@included_tables varchar(4000)''insieme di tabelle i cui indici devono essere ricostruiti indipendentemente dal numero minimo di pagine di dati e il livello di frammentazione (es.: 'dbo.Products, dbo.Customers')

  • 01.ind_maint__reorganize
    • lanciata nel contesto di un database ne riorganizza gli indici in funzione delle seguenti variabili:
 nome variabile tipodefault significato
@min_page_count int 1000numero minimo di pagine di dati di cui deve essere costituito un indice per essere ricostruito
@min_avg_fragmentation_in_percent int 5soglia minima di frammentazione (in %) che deve avere un indice per essere ricostruito
@max_avg_fragmentation_in_percent int30soglia massima di frammentazione (in %) che deve avere un indice per essere ricostruito
@included_tables varchar(4000)''insieme di tabelle i cui indici devono essere ricostruiti indipendentemente dal numero minimo di pagine di dati e il livello di frammentazione (es.: 'dbo.Products, dbo.Customers') 


Note

  • i valori di default di @min_page_count, @min_avg_fragmentation_in_percent e @max_avg_fragmentation_in_persent NON sono stati scelti a caso :)
  • l'esperienza mia (...e non solo) dimostra che
    1. la riorganizzazione/ricostruzione di indici composti da meno di 1.000 pagine porta spesso ad avere un livello di frammentazione superiore a quello pre-deframmentazione
    2. un livello di frammentazione superiore al 30% migliora moltissimo con una ricostruzione e molto meno della riorganizzazione
    3. un livello di frammentazione compreso tra 5% e 30% migliora moltissimo con una riorganizzazione
    4. un livello di frammentazione inferiore al 5% non necessità di alcuna deframmentazione

Video tutorial


ċ
00.ind_maint__setup.sql
Scarica
T-SQL Script  2 k v. 4 11/feb/2010 03:36 Francesco Quaratino
ċ
01.int_maint__reorganize.sql
Scarica
T-SQL Script  5 k v. 1 30/nov/2010 05:40 Francesco Quaratino
ċ
02.ind_maint__rebuild.sql
Scarica
T-SQL Script  6 k v. 6 30/nov/2010 05:41 Francesco Quaratino
č
index_maintenance.mp4
Scarica
MP4  14924 k v. 4 17/feb/2010 15:07 Francesco Quaratino
Comments