オンプレミスのSQLデータベースでは、あまり使用されていないときに、インデックスを時々再構築するためのメンテナンスプランが用意されています。
Azure SQL DBで設定するにはどうすればよいですか?
P.S:以前に試しましたが、そのためのオプションが見つからなかったので、 この投稿 を読んで試してみるまで、彼らはそれを自動的にやっていると思いました:
SELECT
DB_NAME() AS DBName
,OBJECT_NAME(ps.object_id) AS TableName
,i.name AS IndexName
,ips.index_type_desc
,ips.avg_fragmentation_in_percent
FROM sys.dm_db_partition_stats ps
INNER JOIN sys.indexes i
ON ps.object_id = i.object_id
AND ps.index_id = i.index_id
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips
ORDER BY ps.object_id, ps.index_id
そして、メンテナンスが必要なインデックスがあることがわかりました (
ほとんどの人は、SQL Azureでインデックスを再構築することをまったく考慮する必要がないことを指摘します。はい、B +ツリーインデックスは断片化される可能性があります。また、これにより、完全にチューニングされたインデックスと比較して、スペースのオーバーヘッドとCPUのオーバーヘッドが発生する可能性があります。そのため、お客様と協力してインデックスを再構築するシナリオがいくつかあります。 (主なシナリオは、現在のアーキテクチャによりディスク領域がSQL Azureである程度制限されているため、現在顧客が領域を使い果たす可能性がある場合です)。したがって、データベースを管理するためにSQL Serverモデルを使用することは「間違った」ことではありませんが、努力する価値がある場合とそうでない場合があることを検討してください。
(インデックスの再構築が必要になった場合は、他の投稿者がここに投稿したモデルを使用することを歓迎します。これらは通常、タスクをスクリプト化するのに適したモデルです。SQLAzureマネージドインスタンスは、必要に応じて、メンテナンス操作をスクリプト化するジョブを作成します)。
インデックスの再構築の候補者になる可能性があるかどうかを判断するのに役立ついくつかの詳細を次に示します。
私が顧客に提供する公式の推奨事項は、実際のニーズを実証しているティア1アプリ(費用を上回るメリット)またはSaaS弾性プールまたはマルチテナントデータベース設計の多くのデータベース/顧客のワークロードを調整しようとしているISVで、非常に大きなデータベースでCOGSを削減したり、ディスク領域の不足(前述)を回避したりできるようにします。プラットフォーム上で最大の顧客である場合、時々顧客と手動でインデックス操作を行うことで価値が見られますが、この種の操作を「ちょうど」行う通常の仕事を必要としないことがよくあります。 SQLチームの意図は、これを気にする必要はまったくなく、代わりにアプリに集中できることです。もちろん、自動メカニズムに追加または改善できるものは常にあります。個々の顧客データベースに旧姓がある可能性を完全に許容しますこのようなアクションの場合。私が言及した事例を超えて自分自身を見たことはありませんし、それらでさえ問題になることはめったにありません。
これにより、プラットフォームでこれがまだ行われていない理由を理解するためのコンテキストが得られることを願っています。他の差し迫ったニーズと比較して、今日のサービスにある顧客データベースの大部分にとっては問題ではありませんでした。もちろん、各計画サイクルを構築するために必要なもののリストを再検討し、定期的にこのような機会を検討しています。
幸運-ここであなたの結果が何であれ、これがあなたが正しい選択をするのに役立つことを願っています。
よろしくお願いいたします。ConorCunningham Architect、SQL
ここで説明するように、Azure Automationを使用してインデックスメンテナンスタスクをスケジュールできます。 Azure Automationを使用したSQLデータベースインデックスの再構築
以下の手順:
1) https://portal.Azure.com に移動し、[新規]> [管理]> [自動化アカウント]を選択して、自動化アカウントを用意します
2)Automationアカウントを作成した後、詳細を開き、Runbooks> Browse Galleryをクリックします
検索ボックスに「インデックス」という単語とRunbook「Azureデータベースのフラグメンテーションが多い場合のインデックステーブル」を入力します。
4)Runbookの作成者は、SC Microsoftの自動化製品チームです。[インポート]をクリックします。
5)Runbookのインポート後、データベースの資格情報をアセットに追加しましょう。 [資産]> [認証情報]をクリックし、[認証情報を追加…]ボタンをクリックします。
6)資格情報名(Runbookで後で使用される)、データベースユーザー名、およびパスワードを設定します。
7)Runbookを再度クリックし、リストから「Update-SQLIndexRunbook」を選択して、「編集…」ボタンをクリックします。実行されるPowerShellスクリプトを確認できます。
8)スクリプトをテストする場合は、[テストペイン]ボタンをクリックするだけで、テストウィンドウが開きます。必要なパラメーターを導入し、[開始]をクリックしてインデックスの再構築を実行します。エラーが発生した場合、エラーは結果ウィンドウに記録されます。データベースと他のパラメータによっては、完了するまでに時間がかかる場合があることに注意してください。
9)エディターに戻り、「発行」ボタンをクリックしてRunbookを有効にします。 「開始」をクリックすると、パラメータを要求するウィンドウが表示されます。しかし、このタスクをスケジュールしたいので、代わりに「スケジュール」ボタンをクリックします。
10)[スケジュール]リンクをクリックして、Runbookの新しいスケジュールを作成します。週に1回指定しましたが、それはワークロードとインデックスが時間の経過とともに断片化をどのように増やすかによって異なります。ニーズに基づいて、実行の間に最初のクエリを実行して、スケジュールを調整する必要があります。
11)次に、パラメーターと実行設定を紹介します。
注:異なる設定で異なるスケジュール、つまり特定のテーブルに特定のスケジュールを設定して遊ぶことができます。
これで完了です。必要に応じてロギング設定を忘れずに変更してください。
Azure Automationは優れており、価格もごくわずかです。
あなたが持っているいくつかの他のオプションは次のとおりです
1.SQL実行タスクを作成し、SQLエージェントを介してスケジュールします。SQL実行タスクには、統計再構築とともにインデックス再構築コードが含まれている必要があります。
2.SQLAZUREへのリンクサーバーを作成し、SQLエージェントジョブを作成することもできます。Azureへのリンクサーバーを作成するには、このSO link: 追加する必要がありますMS Azure SQL Serverへのリンクサーバー
@ TheGamiswar が推奨されているように、 リンクサーバー を追加してから、次のようなストアドプロシージャを作成します。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [LinkedServerName].[RemoteDB].[dbo].[sp_RebuildReorganizIndexes]
AS
BEGIN
ALTER INDEX PK_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON);
ALTER INDEX IX_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON); --Nonclustered index
ALTER INDEX PK_MyTable ON MyTable REORGANIZE;
ALTER INDEX IX_MyTable ON MyTable REORGANIZE;
END
次に、リンクサーバーで「SQL Serverエージェント」を使用して、新しいジョブとスケジュールを作成します。
詳細については、 https://docs.Microsoft.com/en-us/sql/ssms/agent/create-a-job?view=sql-server-2017 を参照してください