Azure Elastic Job Agent を使用して次の手順でSQLメンテナンスジョブを作成しました。
EXEC jobs.sp_add_jobstep @job_name = @jobName,
@step_name = 'Optimize indexes and statistics',
@command=N'
EXECUTE dbo.IndexOptimize
@Databases = ''USER_DATABASES'',
@FragmentationLow = NULL,
@FragmentationMedium = ''INDEX_REORGANIZE,INDEX_REBUILD_ONLINE'',
@FragmentationHigh = ''INDEX_REBUILD_ONLINE'',
@FragmentationLevel1 = 10,
@FragmentationLevel2 = 30,
@MinNumberOfPages = 10,
@TimeLimit = 3600,
@UpdateStatistics = ''ALL'',
@OnlyModifiedStatistics = ''Y'',
@SortInTempdb = ''Y'',
@MaxDOP = 1,
@LogToTable = ''Y''
',
@credential_name = @jobStepCredName,
@target_group_name= @targetGroupName,
@retry_attempts = 0,
@step_timeout_seconds = 3600,
@max_parallelism = 1 -- IMPORTANT! We don't want to run index optimization on multiple databases at the same time
このコードは、ストアドプロシージャ dbo.IndexOptimize を使用しており、Ola Hallengrenによって提供されています。
ジョブは毎日午前5時に実行するようにスケジュールされ、週に1〜2回失敗します。失敗の理由は、Azure Elastic Job Agentの内部的な問題です:「このタスクの進行中にジョブサービスが再起動しました。」 Azureのサービスはまだプレビュー段階にあるため、内部サービスエラーが予想されます。
現在の解決策は、@ retry_attemptsを0より大きい数に設定して、ジョブエージェントがステップを再試行できるようにすることですが、インデックスの最適化のために失敗したステップを再試行するのが良いかどうかはわかりません。
特に、INDEX REBUILD、INDEX REORGANIZE、OR UPDATE STATISTICSプロセスがキャンセルまたは強制終了された場合にどうなるかはわかりません。
要約すると、次の質問があります:
この件についてのフィードバックに感謝します。
@Resumable = 'Y'オプションをジョブに追加し、再起動するか、次のスケジュールでジョブを実行して終了するのを待つ必要があります。これは、多くのユーザーが使用している間にインデックスの再構築を実行しているため、時間と同時実行性の問題に依存します。データベースが問題になる可能性があります。
以前のバージョンでは統計とインデックスの再構築はトランザクションでしたので、alter index rebuildステートメントが失敗した場合、結果はロールバックされ、古いオブジェクトが使用されましたが、2017年以降は新しいオプション WITH(RESUMABLE = ON) があります後でインデックスの再構築を再開できます。
Olaのスクリプト の@WaitAtLowPriorityMaxDurationおよび@LockTimeoutパラメータも確認する必要があります。これらはブロッキングの最小化に役立つためです。