Azure の PaaS として提供されている SQL Database ですが、一般的な RDB ですので、インデックスの断片化が発生し、断片化の進行が進むと、インデックスの再構築 (または再構成) を実施を検討する必要があります。
# 断片化の発生速度と、メンテナンスにかかる時間のトレードオフとなりますが。
Azure Automation では、ギャラリーでインデックスの断片化を解消するためのランブックを簡単に作成することができるようになっていますので、作成の方法をまとめてみたいと思います。
Automation として、SQL Database との接続に使用するための資格情報がアセット (資産) として必要となります。
Automation アカウントに資格情報を登録したら、新しい Runbook の作成を行います。
Runbook を作成する際に「ギャラリーを参照」をクリックし、
「Indexes tables in an Azure database if they have a high fragmentation」をギャラリーからインポートします。
作成された Runbook を定期的に実行することで、SQL Database のインデックスの再構築を実施することができます。
実際に作成された Runbook を実行してみたのですが、既定のスキーマ以外には対応していない内容となっていたので、複数のスキーマを使用している環境では、以下のような修正を実施する必要があります。
SQL Database 向けの Wide World Importers を使用して、検証したのですが、複数スキーマの DB のため、インポート直後の状態では、エラーになってしまいました。
<# $SQLCommandString = @" SELECT t.name AS TableName, t.OBJECT_ID FROM sys.tables t "@ #> $SQLCommandString = @" SELECT QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(t.name) AS TableName, t.OBJECT_ID FROM sys.tables t "@
また、SQL Database では、クエリの進捗状況を取得することができますので、以下のようにクエリを修正することで、インデックスの再構築の進行を確認することができます。
<# $SQLCommandString = @" EXEC('ALTER INDEX ALL ON $Using:TableName REBUILD with (ONLINE=ON)') "@ #> $SQLCommandString = @" EXEC('SET STATISTICS PROFILE ON;ALTER INDEX ALL ON $Using:TableName REBUILD with (ONLINE=ON)') "@
クエリの実行時間については、25 分でタイムアウトするような設定となっています。
Azure Automation では実行時間が 30 分を超える Runbook は他の Runbook が実行できるようにアンロードされ、最新のチェックポイントからの再開となるようですので、大きなサイズのテーブルのインデックスのメンテナンスについては、実行時間を考量する必要が出てきそうですね。
# DB 側としてはパフォーマンスレベルと、パーティショニングを使用したデータ分割が対応内容ですかね。
Azure Automation: チェックポイントを活用して、信頼性の高いフォールト トレラントな Runbook を実行
インデックスの再構築のような時間がかかるクエリは、Native PowerShell Runbook ではなく、チェックポイントがサポートされている Workbook Runbook の方が向いているんですね。
初めての PowerShell Runbook / Announcing Native PowerShell Script Support in Azure Automation を、一読しておくとよさそうです。
インデックスの再構築用のクエリも、そのうち Runbook 対応したいなと思います。