薄暗いサーバールームの片隅で、光るモニターの数字が静かに瞬いています。
目には見えない小さな乱れが、データベースの中で静かに進行しています。断片化――それは、整然と並ぶはずのデータが、知らぬ間にばらばらになってしまう現象です。
SQL Serverでは、テーブルのインデックスが断片化すると検索や更新のパフォーマンスに影響します。
まるで、長い年月を経てページが崩れた古書のように、読みたい情報にたどり着くための道を遠回りさせます。
断片化は修復可能で、正しい手順を踏めばデータベースは再び軽やかに息を吹き返します。
断片化率に応じてインデックスを再構築(REBUILD)または再構成(REORGANIZE)することが推奨されます。
断片化率が1%〜30%未満の場合
インデックスを「再構成(REORGANIZE)」します。
これはインデックスのページを整理する軽量な操作で、システムの稼働をほとんど止めずに実行可能です。
## 断片化率が1%〜30%未満の場合 ALTER INDEX [インデックス名] ON [テーブル名] REORGANIZE;
断片化率が30%以上の場合
インデックスを「再構築(REBUILD)」します。
これはインデックスを一度削除して作り直す操作で、完全に順序を整え直すため、断片化が深い場合に有効です。
## 断片化率が30%以上の場合 ALTER INDEX [インデックス名] ON [テーブル名] REBUILD;
オンラインで再構築したい場合
システムを停止させずにインデックスを再構築したい場合は、WITH (ONLINE = ON)
オプションを付けます。
## オンラインで再構築したい場合 ALTER INDEX [インデックス名] ON [テーブル名] REBUILD WITH (ONLINE = ON);
エディションによる制限
ただし、このオンライン再構築はSQL Serverのエディションによって利用可否が異なります。
特にStandard Editionではオンラインで利用できないので、実質的な実行タイミングはメンテ時などに限られます。
- Enterprise Edition / Developer Edition / Business Critical Edition(Azure SQL含む)
→ ONLINE = ON が利用可能です。システム稼働中にインデックスを再構築できるため、ユーザーへの影響を最小限に抑えながら作業が行えます。 - Standard Edition / Web Edition / Express Edition
→ ONLINE = ON はサポートされていません。この場合、再構築中はテーブルにロックがかかり、アクセスがブロックされます。ユーザーからの問い合わせやトランザクションは待機状態になるため、運用上の影響に注意が必要です。
注意点
- オンライン再構築を使用しても完全に無停止ではありません。内部的に短時間のスキーマ修正ロック(Sch-Mロック)が発生する場合があります。
- 大きなテーブルや大量のインデックスでは、オンライン再構築でもCPUやI/O負荷が増大することがあります。リソースが逼迫している環境では、他の処理への影響も考慮する必要があります。
- 運用中のテーブルでオンライン再構築を行う場合は、可能であれば業務の負荷が低い時間帯にスケジュールすることが推奨されます。
断片化率に応じて適切にインデックスを整理することで、SQL Serverのパフォーマンスを維持することができます。