ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

インデックス断片化調査

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)
    • 現在のインデックスはそのままで新しいインデックスを作成する。(DBのデータファイルが新しいインデックス分容量が増える)
    • 完了までがトランザクションになるため、途中で止めた場合、全てロールバックになる。
    • 完了まではインデックスが2つ存在する状態

参考: https://blogs.msdn.microsoft.com/jpsql/2013/02/28/977/ https://docs.microsoft.com/ja-jp/sql/relational-databases/indexes/reorganize-and-rebuild-indexes