インデックス断片化調査
SQL Serverびインデックス断片化の調査
とりあえず30%以上だったら、最高値を検討しよう
SELECT a.index_id, name, avg_fragmentation_in_percent FROM sys.dm_db_index_physical_stats (DB_ID(N'DbName'), NULL, NULL, NULL, NULL) AS a JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id WHERE avg_fragmentation_in_percent > 30 GO
インデックス再構成
断片化が30%未満の場合、再編成でも大丈夫らしい
ALTER INDEX IDX_INDEX1 ON DbName.TableName REORGANIZE ;
テーブルの全インデックス再構成
ALTER INDEX ALL ON DbName.TableName REORGANIZE ;
インデックス再構築
断片化が30%以上の場合、再構築が有効
ALTER INDEX IDX_INDEX1 ON DbName.TableName REBUILD ;
テーブルの全インデックス再構築
ALTER INDEX ALL ON DbName.TableName REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = ON);
REBUILD WITH (ONLINE = ON) ;
インデックスの再構成と再構築の違い
再構築がひとつのトランザクションでインデックスを完全に再作成するのに対して、再構成は処理単位ごと (処理単位はページ) にトランザクションが分割されていて、リーフページ間でインデックス行を移動させることで行を前に詰めて断片化を解消しているという点
- 再構成(REORGANIZE)
- 再構築(REBUILD)
参考: https://blogs.msdn.microsoft.com/jpsql/2013/02/28/977/ https://docs.microsoft.com/ja-jp/sql/relational-databases/indexes/reorganize-and-rebuild-indexes