インデックスの断片化

インデックスの断片化を調査するSQLは以下の通り

SELECT	 DB_NAME(database_id)    as db_name
		,OBJECT_NAME(object_id)  as table_name
		,(select	min(name) from	sys.indexes 
		  where sys.indexes.object_id = sys.dm_db_index_physical_stats.object_id 
		  and  sys.indexes.index_id = sys.dm_db_index_physical_stats.index_id)as index_name
		,index_type_desc   
		,avg_fragmentation_in_percent  --断片化の割合
		,fragment_count                --インデックス内の断片化の数
		,avg_fragment_size_in_pages    --インデックス内の1つ断片化内の平均ページ数
FROM sys.dm_db_index_physical_stats
(DB_ID(),NULL, NULL, NULL , 'LIMITED');

avg_fragmentation_in_percentの値が30%を超えると断片化の解消を検討した方がよい。



断片化を解消するための手段は以下の2つがある。



インデックスの再構成(REORGANIZE)・・・既に割り当てられている領域を利用して断片化の解消を行う

ALTER INDEX idx_hoge ON tbl_hoge REORGANIZE

インデックスの再構築(REBUILD)・・・新規のページを使用して断片化の解消が行う

ALTER INDEX idx_hoge ON tbl_hoge REBUILD

インデックスの断片化を解消する効果は再構成より再構築の方が高い



なお、以前のバージョンでは同様の機能としてDBCC DBREINDEXがあったが非推奨となっている



動作確認環境:SqlServer 2008 Express