ロックはデータの整合性に不可欠であることは誰もが知っていますが、それがあなたの側に深刻な棘になる可能性があるという事実は変わりません!
データベースでブロッキングが発生している場合、何かが間違っていると考えることがよくありますが、常にそうであるとは限りません。私の経験では、SQL Serverのブロックの大部分は正当ですが、調査して理解する必要があります。一方、デッドロックが正当なものになることはめったにありません。 SQL Serverは手動による介入を必要とせずにデッドロックを解決するため、プロセスは自動的に強制終了されるため、デッドロックはSQLServerの世界では重要であると見なされています。繰り返しになりますが、それらは「解決」されていますが、確実に調査して理解する必要があります。
データベースでのSQLServerのブロックとデッドロックの発生を減らすのに役立つ設計戦略がいくつかあります。
- 使用率の高いテーブルでクラスター化インデックスを使用する
- 行数の多いSQLステートメントは避けてください
- 長いトランザクションを多くの短いトランザクションに分割します
- UPDATEステートメントとDELETEステートメントがインデックスを使用していることを確認してください
- バッチ更新ジョブが重複するようにスケジュールしないでください
- 統計を最新の状態に保つ
他にもたくさんあると思いますが、現実には、考えられるすべてのベストプラクティスに従うことができ、それでもブロッキングとデッドロックが発生します。これは、ほとんどの場合、デッドロックは不適切に設計されたアプリケーションコードが原因で発生するためです。 (アプリケーション設計のうさぎの穴:コーディング、トランザクション分離、アクセスパターン。ただし、ここでは、ブロッキングとデッドロックの調査と理解に焦点を当てましょう。)
SQLServerのブロックとデッドロック
ブロッキングとデッドロックの最初の課題は、通常は報告されない、事後に報告される、または自動的に解決されるため、いつどこで発生しているかを特定することです。ブロッキングとデッドロックに関してデータベースで何が起こっているのかを実際に理解するには、時間の経過とともにそれらの発生を確認する必要があります。また、問題を修正して将来の発生を阻止するには、ブロッキングの根本原因を突き止める必要があります。アプリケーション開発者に中継する必要のある情報を入手して、開発者間の非難ゲームに終止符を打つ必要があります。およびDBA。
これが、私がワークロードアナライザーが本当に好きな理由です。 SpotlightCloudで。時間範囲(1時間、1日、またはカスタム範囲)を選択して、ロックを表示できます。 その範囲の関連アクティビティ。すぐに、私は何が起こっているのかをよりよく理解しています!ロックパターンを確認し、時間の経過に伴うロックの割合を以前の時間範囲と比較し、特定の時間枠でのブロックの割合を確認し、排他的ロック、共有、更新などのロックKPIを確認できます。
そこで、根本的な原因を突き止めたいと思います。ここで、ディメンションツリー 特定の時間枠の情報をドリルダウンしてフィルタリングできるため、データベースなどのより深い次元で同じ情報を表示できます。 、ユーザー 、プログラム 、およびSQLステートメント 、進行中に「ホワイトノイズ」を除去しながら、問題の原因を明確に特定します。
ここでは、どのデータベースを調べています。 時間範囲中に最も多くのロックが発生しています:
次に、ユーザーをドリルダウンします 選択したデータベース内:
次に、SQLステートメントのリストを表示することを選択します 選択したユーザーによって実行されたロックを引き起こします 選択したデータベース 指定された時間範囲 。
これで、すべてのロックを確認できます。 選択したSQLステートメントの関連情報 。
したがって、ロック、ブロック、およびデッドロックの問題を解決したい場合は、SpotlightCloudを確認することをお勧めします。 Spotlight Cloudを使用すると、データベース内のロックの問題をこれまでになく簡単に調査および理解し、最終的にアプリケーションコードにデッドロックが発生しないようにすることができます。