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