SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure SQL Database と Azure SQL Managed Instance のブロッキング検出について

leave a comment

SQL Server ベースの環境で、ロック競合に伴うブロッキングの情報を取得する際には、blocked process thresholdBlocked Process Report を使用するのが一般的な取得方法となります。

Azure SQL は変更可能な設定が制限されていますが、Azure SQL Databsae (SQLDB) と Azure SQL Managed Instance (MI) では、どのような設定ができるのかをまとめておきたいと思います。

各環境の設定値

Blocked Process Report を取得するためには、「blocked process threshold (s)」を設定する必要があります。

SQLDB と MI では初期設定と設定変更の可否が異なります。

  • SQLDB
    • デフォルトは 20 に設定されており設定変更不可
  • MI
    • デフォルトは 0 に設定されており、sp_configure で変更可能

SQLDB は設定を変更することができず 20 秒固定となっています。SqlCommand の CommandTimeout はデフォルトで 30 秒となっているので、デフォルトで使用している場合は Blocked Process Report の拡張イベントを使用してブロッキング情報を取得することができます。

 

CommandTimeout を 20 秒未満にしている場合、拡張イベントでブロッキングを取得することはできないため、sys.dm_exec_requests / sys.dm_os_waiting_tasks から定期的に情報を取得し、ロック競合の情報を確認することを検討する必要があります。

MI についてはデフォルトは 0 で設定されていますが、sp_configure で設定を変更することが可能ですので、SQL Server と同様に設定を調整することが可能です。

MI については、SQLDB と異なり、新規作成したデータベースについても、RCSI / スナップショット分離レベルは無効の状態となっていますので、SELECT 実行時にロックが取得され SQLDB とはロック競合についての考慮が少し異なってきます。

 

ロック競合は同時実行性を低下させる大きな要因の一つとなり、PaaS の SQL Server ベースの環境でも考慮すべき内容の一つとなります。

「自分が使用している環境ではどのようにロック競合の情報を取得することができるか?」は重要ですので、使用している環境でどのような手法が使用できるかは把握しておくとよいのではないでしょうか。

Share

Written by Masayuki.Ozawa

10月 15th, 2023 at 10:35 pm

Leave a Reply