インデックスの断片化を調査する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