Friday, May 18, 2007

Optimering utav SQL server. Index fragmentering

Hitta fragmentering i index

Vilka index skall vi leta fragmentering i? Liksom i den andra artikeln så bör vi titta efter index som används i tunga querys och som används ofta. Med hjälp utav SQL Profilern och den färdiga templaten SQLProfilerTSQL_Duration få vi fram en tracefil för vidare undersökning utav tabeller som kan vara lämpliga för en närmare analys.
I SQL 2000 används dbcc showcontig. I SQL 2005 finns det nya funktioner för att se denna information. Kör en SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'AdventureWorks'), OBJECT_ID(), NULL, NULL , 'DETAILED');
I kollumnen avg_fragmentation_in_percent ser man fragmenteringen utav indexen, detta bör vara så nära noll som möjligt. Värdet avg_page_space_used_in_percent skall vara så nära 100 som möjligt eller så nära den fyllnadsgrad man valt på indexet. Med detta kommando få man ut massa information om indexet.

Ett exempel i sql 2000 kan se ut så här:

DBCC SHOWCONTIG scanning 'MIS_MIS_ART_SUP_HIST' table...
Table: 'MIS_MIS_ART_SUP_HIST' (1554104577); index ID: 1, database ID: 14
TABLE level scan performed.
- Pages Scanned................................: 8096
- Extents Scanned..............................: 1019
- Extent Switches..............................: 1018
- Avg. Pages per Extent........................: 7.9
- Scan Density [Best Count:Actual Count].......: 99.31% [1012:1019]
- Logical Scan Fragmentation ..................: 0.00%
- Extent Scan Fragmentation ...................: 0.10%
- Avg. Bytes Free per Page.....................: 1551.1
- Avg. Page Density (full).....................: 80.84%
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Här har vi då information om indexet på en tabell. För att det skall vara någon större idé att defragmentera så bör indexet generellt sett har mer än 1000 pages.

För att se om vi har en fragmetering utav indexet tittar vi främst på två värden. Avg. Page Density (full) som bör vara så nära den fyllnadsgrad som är valt på indexet. Är det skapat med 100% fyllnadsgrad så skall det liggar där omkring. I exeplet har vi just kört en dbcc dbreindex vilket optimerat indexet och fyllnadsgraden ligger nästan på 100%.

Logical Scan Fragmentation skall ligga så nära noll som möjligt. Går det över 10% börja det bli ett performance problem.

Med detta i tanken så är det lättare att avgöra om man skall defragmentera ett index eller ej. Att göra en sådan operation kan ta lång tid och mycket kraft från servern så behövs det inte så gör det ej.