質問者
インデックス再構築をタスクスケジューラから起動する

質問
-
インデックスの再構築処理をタスクスケジューラから起動する方向で検討しています。
詳細な仕様は下記のとおりです。
OS:Windows Server2016
DB:SQLServer 2017 Standard
処理サイクル:週次
起動方法:タスクスケジューラより起動(下記sql文を実行するバッチプログラム)
ALTER INDEX ALL ON [テーブル名] REBUILD
対象テーブルのデータレコード総件数:150,000,000件(※対象テーブルは複数あります)
確認させていただきたいのは、下記2点です。
①「タスクスケジューラを停止するまでの時間」を「1時間」に設定した状態で、処理開始から1時間経過した場合、
再構築処理はどのような状態になるでしょうか。
・実施済みのテーブルについては再構築完了、実施中もしくは実施未了のテーブルについては元の状態
・ロックがかかって使用できなくなる、など
②(①の方法が推奨されない場合)
レコード件数の急激な増加や処理自体の不具合(他プロセスによってロックされるなど)のリスク回避策として、
①のように処理の停止時間を設けたいと考えています。Enterpriseであればオンラインでの再構築で時間指定可能
かと思いますが、当方の環境で実現可能な方法はありますでしょうか。
すべての返信
-
①については、ALTER INDEX ALL ON [テーブル名] REBUILD 単位でトランザクションが発生するため、既に処理が完了しているインデックスの再構築コマンドはそのままの状態で保持され、まさにインデックスの再構築を実施中のトランザクションについては、ロールバックされ、元の状態に戻ります。
なお、ALTER INDEX ALL ON [テーブル名] REBUILD コマンドの場合、仮にテーブル上に100個のインデックスがあり、88個のインデックスの再構築が完了していたとしても、その後、該当コマンドがアボートした場合、すべて処理がロールバックされて元の状態に戻ることになると思います。
また、再構築コマンドの実行が途中でアボートしたとしても、不正なロックが保持され続けることはなく、ロールバックが完了後、使用可能な状態に回復すると思います。 ただ、ALTER INDEX ALL ON [テーブル名] REBUILD コマンドの場合、コマンドの開始時にオブジェクトに対してスキーマ修正ロック(Sch-M)が獲得され、処理の完了時 もしくは、ロールバックが完了したタイミングで解放されるため、その間は、該当テーブルに対する処理を実施することができなくなるかと。
②については、①の手法で特に問題はないかと思いますが、サイズの大きいテーブルに対してインデックスの再構築を実施する場合、ALTER INDEX ALL を指定するのではなく、インデックスを明示的に指定することで、仮に1時間を過ぎてインデックスの再構築処理がロールバックされたとしても、ロールバックの対象が1つのインデックスとなるなど、ロールバックの範囲を狭めることができたり、月曜日は A、B インデックス、火曜日は C、D インデックスを再構築するなど、インデックスの再構築の対象を少なくすることで、インデックスの再構築の完了時間が1時間を超える現象を軽減できる可能性はあるかと思います。
- 回答の候補に設定 kumo-msftMicrosoft contingent staff, Moderator 2020年2月14日 1:47
-
MSQ太郎さん、こんにちは。フォーラムオペレーターのクモです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
ご質問いただいた件ですが、その後いかがでしょうか。
皆様から寄せられた投稿はお役に立ちましたか。
参考になった投稿には [回答としてマーク] をお願い致します。
設定いただくことで、
他のユーザーもお役に立つ回答を見つけやすくなります。
お手数ですが、ご協力の程どうかよろしくお願いいたします。MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~