Resumable Online Index Rebuild is in public preview for Azure SQL DB でアナウンスされていますが、SQL Database で、SQL Server 2017 で実装される再開可能なオンラインインデックス再構築が、Public Preview ではありますが利用可能となりました。
今までのインデックスの再構築 (REBUILD) については、再構築のキャンセルを行った場合は、それまでの再構築の処理内容はすべて破棄され、次回のインデックス再構築時には、最初からやりな意思が行われるような動作となっていました。
インデックス再構築と再構成の違い
そのため、インデックスの再構築が実施可能な期間内に処理が完了させられないような状況が続くと、いつまでもインデックスのメンテナンスを最後まで実行できないようなケースが考えられました。
これに対してのアプローチとして「再開可能なオンラインインデックス再構築」という機能が追加されます。
この処理は、オンラインインデックス再構築を実施する場合にのみ利用することができるのですが、オンラインインデックス再構築を実施する場合に、キャンセルだけでなく中断という処理を実施することができるようになりました。
再開可能なインデックス再構築に関する考慮事項
ALTER INDEX 文にいくつかのオプションが追加されています。
基本的なクエリのパターンとしては、次のようなものになるかと。
-- 再開可能なオンラインインデックス再構築 ALTER INDEX [PK_T1] ON [dbo].[T1] REBUILD PARTITION = ALL WITH (RESUMABLE = ON, ONLINE = ON, MAX_DURATION = 1) -- 停止 ALTER INDEX [PK_T1] ON [dbo].[T1] PAUSE -- キャンセル ALTER INDEX [PK_T1] ON [dbo].[T1] ABORT -- 再開 ALTER INDEX [PK_T1] ON [dbo].[T1] RESUME WITH (MAXDOP=0, MAX_DURATION=1) -- インデックス構築状態の取得 SELECT * FROM sys.index_resumable_operations
「ONLINE = ON」のインデックス再構築を実施する場合に、「RESUMABLE = ON」や「MAX_DURATION = xx」 というオプションを設定することができるようになります。
RESUMABLE = ON は、再開可能なオンラインインデックス再構築による処理を実施する場合の必要となるのですが、インデックスの再構築を実行する時間を MAX_DURATION として設定することができるようになっています。
これは、分単位の指定になるのですが、指定した分数、再構築の処理が行われた場合、自動的に停止 (PAUSE) 状態にするような設定を再構築時に行うことができます。
明示的に停止や、キャンセルすることも可能となっており、再開時には、RESUME によるインデックスの再構築を実施することで、中断していた個所から処理が継続されるようになります。
インデックスの再構築の状態については index_resumable_operations (Transact-SQL) から確認することができ「percent_complete」の項目からどの程度、インデックスの再構築が完了しているのかを確認することができます。
意識しておきたい内容としては、「再開可能なインデックスの考慮事項」に記載されている次の内容でしょうか。
インデックス操作が一時停止しているときに、元の両方のインデックスとディスク領域と DML 操作中に更新する必要があります、新しく作成されたものが必要とします。
一般に、再開可能な状態と再開不可のオンライン インデックス再構築のパフォーマンスの違いはありません。Generally, there is no performance difference between resumable and non-resumable online index rebuild. 再開可能なインデックスを更新すると、インデックスの再構築操作中には一時停止します。When you update a resumable index while an index rebuild operation is paused:
- 通常は読み取り専用のワークロードのパフォーマンスに与える影響は大きくありません。For read-mostly workloads, the performance impact is insignificant.
- 更新プログラムの量が多いワークロードでいくつかのスループットの低下 (当社テスト 10% 未満の番組の低下) があります。
現状、日本語が機械翻訳のため、微妙な表現で鵜sが、インデックスの再構築を停止 (PAUSE) している際に、データの変更が発生した場合、元のインデックスと再構築中のインデックスの両方の領域に対して変更が必要となるため、再構築の停止中に変更が発生する場合のオーバーヘッドを考慮する必要があります。
通常の UPDATE では、以下のように該当のデータ部分にのみ変更が発生します。
再開可能なオンラインインデックス再構築の中断中に、データが更新された場合は、再開可能な再構築に使用している内部の領域に対してもデータの変更が発生しているようで、単純なデータの更新と比較しても、書き込まれるログの量が多くなっていそうです。
SQL Server 2017 の場合、Enterprise Edition のみの機能ですが、SQL Database であれば、現時点では Basic でも使うことができるみたいですね。
[…] SQL Database で再開可能なオンラインインデックス再構築が Public Preview で利用可能となりました […]
Azure Update (2017.07.20) | ブチザッキ
20 7月 17 at 07:26