文書番号: 323630 - 最終更新日: 2011年5月15日 - リビジョン: 11.0 SQL Server でロックのエスカレーションが原因で発生するブロッキング問題を解決する方法この記事は、以前は次の ID で公開されていました: JP323630 目次概要
ロックのエスカレーションは、粒度が細かい多数のロック (行ロックやページ ロックなど) をテーブル ロックに変換する処理です。Microsoft SQL Server は、ロックのエスカレーションをいつ実行するかを動的に決定します。この決定を行うときに、SQL Server は、特定のスキャンで保持するロックの数、トランザクション全体が保持するロックの数、および全体としてシステムでロックに使用しているメモリを考慮に入れます。SQL Server のデフォルトの動作により、パフォーマンスが改善されるような場面、または過度のシステム ロック メモリをより適切なレベルまで下げる必要があるときにのみ、ロックのエスカレーションが発生します。ただし、一部のアプリケーションやクエリのデザインでは、不適切な場合にロックのエスカレーションが発生することがあり、エスカレートしたテーブルのロックが他のユーザーをブロックすることがあります。この資料では、ロックのエスカレーションがブロッキングの原因であるかどうか判断する方法、および不適切なロックのエスカレーションに対処する方法について説明します。
詳細ロックのエスカレーションがブロッキングの原因であるかどうかを判断する方法多くの場合、ロックのエスカレーションがブロッキングの問題の原因ではありません。ブロッキングの問題が発生したときに、ロックのエスカレーションが発生しているかどうかを判断するには、Lock:Escalation イベントを含む SQL プロファイラのトレースを開始します。Lock:Escalation イベントを確認できない場合、ロックのエスカレーションはサーバー上で発生していません。この場合、この資料の情報は適用されません。ロックのエスカレーションが発生している場合、エスカレートされたテーブルのロックが他のユーザーをブロックしていることを確認します。 ブロッキング チェーンの先頭を確認する方法、およびブロッキング チェーンの先頭で所有されていて他のサーバー プロセス ID (SPID) がブロックされる原因となっているロック リソースを識別する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。 224453
(http://support.microsoft.com/kb/224453/
)
[INF] SQL Server 7.0 または SQL Server 2000 のブロッキング問題と解決策
他のユーザーをブロックしているロックが S (共有) または X (排他) のロック モードを使用する TAB (テーブル レベル) ロック以外の場合、ロックのエスカレーションは問題ではありません。特に、TAB ロックがインテント ロック (ロック モードが IS、IU、または IX など) の場合、これはロックのエスカレーションによるものではありません。ブロッキング問題の原因がロックのエスカレーションではない場合、トラブルシューティングの手順ついては文書番号 224453 の資料を参照してください。
ロックのエスカレーションを防止する方法ロックのエスカレーションを防止する最も簡単で安全な方法は、トランザクションを短くして、負荷の高いクエリのロックの使用状況を削減し、ロックのエスカレーションのしきい値を超えないようにすることです。この目的を達成するにはいくつかの方法がありますが、以下に主な方法を説明します。
エラー : 1204、レベル : 19、状態 : 1。
この時点では、SQL Server が LOCK リソースを取得できません。アクティブなユーザーが少ないときにステートメントを再実行してください。または、SQL Server のロックとメモリの設定を確認するようにシステム管理者に依頼してください。 ROWLOCK などのロック ヒントを使用しても、最初のロック プランが変更されるだけです。ロック ヒントでは、ロックのエスカレーションは防止できません。 この資料で先に説明したロックのエスカレーションの防止方法以外に、トレース フラグを有効にするよりも優れた選択肢があります。さらに、その他の方法では通常、インスタンス全体のロックのエスカレーションを無効にするよりもクエリのパフォーマンスが向上する結果になります。マイクロソフトは、この資料で先に説明したような他の選択肢を調査していますが、ロックのエスカレーションによって発生する深刻なブロッキングを軽減するためにのみ、このトレース フラグを有効にすることを推奨します。SQL Server を起動するたびにトレース フラグを有効にするには、トレース フラグをサーバー起動時のパラメータとして追加します。 サーバー起動時のパラメータを追加するには、SQL Enterprise Manager でサーバーを右クリックし、[プロパティ] をクリックします。次に、[全般] タブの [起動時のパラメータ] をクリックし、次のパラメータを正確に追加します。 -T1211
新しい起動時のパラメータを有効にするために SQL Server サービスを再開する必要があります。クエリ アナライザで次のクエリを実行すると、すぐにトレース フラグが有効になります。
この資料は以下の製品について記述したものです。
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。" | サポート情報 その他のサポートサイトコミュニティお問い合わせサポート技術情報の翻訳
|