Reindicizzare le tabelle in SQL Server 2005

Sapere “utilizzare” un database da un punto di vista di amministratore, significa anche saperlo mantenere. L’utilizzo eccessivo del db, provoca a lungo andare una frammentazione dei dati nelle pagine, e si rileva quindi necessario riorganizzare o reindicizzare una o più tabelle al fine di ripristinare una buona performance sia in lettura che in scrittura.

Normalmente la percentuale di frammentazione dovrebbe attestarsi non oltre il 35% (Microsoft dice anche il 25%), limite oltre il quale le performance della tabella o del db iniziano a scemare.

Per verificare la percentuale di frammentazione si può ricorrere a questa istruzione:

DECLARE @object_name VARCHAR(20);
SET @object_name = ‘TableName’

DBCC SHOWCONTIG (@object_name) WITH TABLERESULTS, ALL_INDEXES

valida per SQL 2000 e SQL 2005 oppure una più elegante

DECLARE @db_id SMALLINT;
DECLARE @object_id INT;

SET @db_id = DB_ID(N’DBName’);
SET @object_id = OBJECT_ID(N’TableName’);

SELECT * FROM sys.dm_db_index_physical_stats(@db_id, @object_id, NULL, NULL , ‘SAMPLED’);

valida per il solo SQL 2005.

Nel primo caso la colonna di riferimento sarà la “LogicalFragmentation” nel secondo “avg_fragmentation_in_percent”.

Quando questo valore è al di sopra della soglia, si rende necessaria la reindicizzazione. Come?

Un sistema veloce e rapido per reindicizzare tutte le tabelle presenti in SQL Server 2005 grazie all’usilio della SP “nascosta” MSForEachTable può essere questo mostrato qui sotto.

EXECUTE sp_MSForEachTable @command1 =’ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF, ONLINE = OFF);’

Questo comando cicla tutte le tabelle e reindicizza tutti gli indici ricostruendoli.

Se invece si vuole essere più specifici e reindicizzare la singola tabella allora si può utilizzare quest’altro comando:

DBCC DBREINDEX (‘NomeTabella’, ”, ValoreDiFrammentazione)

valido per SQL 2000 e SQL 2005.

Si tenga tuttavia presente che la ricostruzione degli indici porta via tempo macchina prezioso durante il quale le performance si fanno sentire. Quindi se non è proprio necessaria la ricostruzione, è meglio ipotizzare una semplice riorganizzazione.

A tal proposito all’interno del BOL, sotto la voce sys.dm_db_index_physical_stats c’è un bellissimo esempio che in base la percentuale di frammentazione sceglie se riscotruire o riorganizzare.