レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

SQLServer2005によるインデックスの断片化診断とリビルド

DBのパフォーマンスチューニングをしてる。
いろいろ技を駆使して、劇的にパフォーマンスアップしたときは爽快だ!

今日依頼を受けたチューニングは、結果としてインデックスの断片化が問題だった。

これにより、「113310ミリ秒(約2分)」かかっていたクエリが
「1923ミリ秒(約2秒)」まで早くなった。

これがたまりません。

インデックスを再編成するにあたっても
まずはどれだけ断片化しているのかを診断する必要がある。
SQL Server 2005 Books Online インデックスの再編成と再構築
http://msdn2.microsoft.com/ja-jp/library/ms189858.aspx

sys.dm_db_index_physical_statsの関数に、なれてなかったので
使い方がはじめわからなかった。

以下のようにSQLを流すと、Indexの断片化についてさまざまな情報がえられる。

SELECT 
    dm.index_id,
    name,
    object_name(dm.object_id),
    avg_fragmentation_in_percent
FROM 
   sys.dm_db_index_physical_stats (DB_ID(), NULL,NULL, NULL, NULL) AS dm
    JOIN sys.indexes AS ind 
    ON dm.object_id = ind.object_id 
    AND dm.index_id = ind.index_id

avg_fragmentation_in_percentが激しくフラグメントしていたので、
全部リビルドした。
非常にコストのかかる操作だが、開発中なのでまったく問題ないだろう。

インデックスのリビルドは、以下のようにALTER INDEXを使う。
以前のDBCC DBREINDEX は非推奨になってる。

ALTER INDEX  インデックス名   ON インデックスの対象オブジェクト名 REBUILD
ALTER INDEX ALL ON インデックスの対象オブジェクト名 REBUILD