none
インデックス再構築をタスクスケジューラから起動する RRS feed

  • 質問

  • インデックスの再構築処理をタスクスケジューラから起動する方向で検討しています。

    詳細な仕様は下記のとおりです。

     OS:Windows Server2016

     DB:SQLServer 2017 Standard

     処理サイクル:週次

     起動方法:タスクスケジューラより起動(下記sql文を実行するバッチプログラム)

      ALTER INDEX ALL ON [テーブル名] REBUILD

     対象テーブルのデータレコード総件数:150,000,000件(※対象テーブルは複数あります)

    確認させていただきたいのは、下記2点です。

    ①「タスクスケジューラを停止するまでの時間」を「1時間」に設定した状態で、処理開始から1時間経過した場合、

     再構築処理はどのような状態になるでしょうか。

     ・実施済みのテーブルについては再構築完了、実施中もしくは実施未了のテーブルについては元の状態

     ・ロックがかかって使用できなくなる、など

    ②(①の方法が推奨されない場合)

     レコード件数の急激な増加や処理自体の不具合(他プロセスによってロックされるなど)のリスク回避策として、

     ①のように処理の停止時間を設けたいと考えています。Enterpriseであればオンラインでの再構築で時間指定可能

     かと思いますが、当方の環境で実現可能な方法はありますでしょうか。

    2020年2月3日 5:15

すべての返信

  • ①については、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時間を超える現象を軽減できる可能性はあるかと思います。


    2020年2月3日 15:41
  • 確実にStandard Editionでインデックスの再構築を行うためには、アクセスをシングルモードに切り替えて実行する

    必要があると思います。

    シングルモードに切り替えた場合、途中でabortさせた場合は、abortを検知してマルチモードに戻さないと通常の

    アクセスができなくなるので考慮が必要と思います。

    2020年2月4日 4:04
  • MSQ太郎さん、こんにちは。フォーラムオペレーターのクモです。 
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。
    皆様から寄せられた投稿はお役に立ちましたか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年2月11日 5:34
    モデレータ