Individuare gli indici duplicati o sovrapposti

Come tutti sappiamo una corretta strategia di indicizzazione è uno dei pilastri più importanti nell'implementazione di un database. Non dobbiamo esagerare, almeno in un database OLTP (in un datawarehouse diventa ammissibile "esagerare" un tantino), definendo troppi indici e, soprattutto, dovremmo verificare regolarmente che gli indici che abbiamo creato siano effettivamente utilizzati ed in questo ci viene in aiuto la sys.dm_db_index_usage_stats.

Talvolta però capita di individuare 2 indici che si sovrappongono fra loro dove uno dei 2 rappresenta un subset dell'altro. Lo script riportato in questo post ci evidenzia tutte le coppie di indici sovrapposti fra loro all'interno di un database. Una volta individuate le diverse coppie, quale eliminare per ciascuna coppia... quello che ha più chiavi di indice (meno compatto quindi meno efficiente) o quello meno "specifico"? Dipende. Come noto l'efficienza di un indice è data in primo luogo dalla compattezza della sua chiave (oltre ovviamente alla selettività); non dobbiamo scordarci, però, che un indice con qualche attributo in più nella definizione della sua chiave può rappresentare un indice di copertura per talune query. Non esiste quindi una regola generale da seguire e la valutazione va fatta caso per caso ricordandosi che, in SQL Server 2005, esiste la clausola INCLUDE che permette di rimuovere degli attributi "secondari" di un indice (non clustered) dalla definizione della chiave e memorizzarli solo nel livello foglia salvaguardando sia la compattezza dell'indice (meno livelli b-tree per andare dalla root al livello foglia) che la possibilità di utilizzare questo indice come indice di copertura per determinate query.

 

Published venerdì 20 giugno 2008 9.06 by lbianchi
Filed under:

Comments

No Comments