Qualcosa su di me

Mi chiamo Andrea Moro, sono un appassionato di informatica da quando avevo 8 anni e da quando mio padre mi regalò il C64.

Qualche anno più tardi, il mio primo pc e nel 1994 la prima esperienza con Internet, di cui mi sono subito innamorato e con cui oggi mando avanti la mia attività di Web Designing e posizionamento nei motori di ricerca.

View Andrea Moro's profile on LinkedIn

Profilo Facebook di Andrea Moro

Calendar

<<  gennaio 2009  >>
lumamegivesado
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar


RSS

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.


Vota questo post per primo

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Aggiungi commento


(Visualizza la tua icona Gravatar)

  Country flag

biuquote
  • Commento
  • Anteprima
Loading



Advanced Technology

Abruzzo SEO specialist, .Net programming and computer stuff