mercoledì 19 settembre 2012

Deframmentazione degli indici (SQL Server)

SQL Server 2005

Alcuni problemi di query time-out possono essere riconducibili ad una alta frammentazione degli indici del database: una frammentazione superiore al 50% può causare un sensibile calo delle prestazioni.
Per capire se gli indici sono frammentati e poi ricostruirli, eseguire i passi sotto elencati:

-- Per visualizzare la frammentazione degli indici del db
SELECT OBJECT_NAME(OBJECT_ID), index_id,index_type_desc,index_level,
      avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count
FROM sys.dm_db_index_physical_stats
(DB_ID(N'OrangeFidelity'), NULL, NULL, NULL , 'SAMPLED')
ORDER BY avg_fragmentation_in_percent DESC

-- Per una query più specifica che comprenda il nome delle tabelle presenti nel db in esame


SELECT OBJECT_NAME(a.OBJECT_ID) Tabella, index_id,index_type_desc,index_level,
      avg_fragmentation_in_percent,avg_page_space_used_in_percent,page_count
FROM sys.dm_db_index_physical_stats
(DB_ID(N'OrangeServer'), NULL, NULL, NULL , 'SAMPLED') a INNER JOIN sys.objects b  on a.object_id = b.object_id
WHERE b.type_desc = 'USER_TABLE'
ORDER BY Tabella, avg_fragmentation_in_percent DESC


-- ESEGUIRE PRIMA UN BACKUP !!! ---

-- Ricostruisce gli indici della tabella DocumentReference in OrangeFidelity
USE OrangeFidelity
ALTER INDEX ALL ON DocumentReference
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON);

-- Ricostruisce gli indici della tabella FidelityHandling in OrangeFidelity
USE OrangeFidelity
ALTER INDEX ALL ON FidelityHandling
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
              STATISTICS_NORECOMPUTE = ON);

Naturalmente queste istruzioni possono essere eseguite per tutte le tabelle dei vari db.

Maggiori informazioni su SQL SERVER – Fragmentation  

Credits: grazie anche al prezioso "intuito informatico" del mitico Giò ;-)

1 commento: