インデックスの断片化

インデックスの断片化の情報を調べるのは以下の通り。

SELECT 
    name						 as	インデックス名,
    object_name(dm.object_id)	 as	テーブル名,
    avg_fragmentation_in_percent as フラグメンテーション率
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

フラグメンテーション率が高い場合は断片化の解消を検討したほうがよい。
解消するにはALTER INDEXを使用するとよい。DBCCでも解消できるが非推奨となっている。



インデックスの再構築を行う。再構築中はテーブルにロックがかかる。

ALTER INDEX ALL ON テーブル名 REBUILD

以下、非推奨のやり方。以前のバージョンの場合はこのコマンドを使う必要があるかも。


インデックスの断片化の情報を調べる。

DBCC SHOWCONTIG (テーブル名)

スキャン密度、論理スキャンの断片化、エクステントスキャンの断片化に問題がある場合は断片化の解消を検討したほうがよい。


インデックスの再構築を行う。再構築中はテーブルにロックがかかる。

DBCC DBREINDEX (テーブル名)


インデックスの断片化の解消を行う。実行中にロックはかからないが、効果はDBCC DBREINDEX の方が高い。

DBCC INDEXDEFRAG (テーブル名)

以前も似たような記事を書いていたのでメモ

http://d.hatena.ne.jp/haradago/20100305


動作確認環境:SQLServer 2008