コンパイル ロックによって発生する SQL Server のブロッキングに関する説明

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:263889
概要
Microsoft SQL Server では一般的に、同時にキャッシュされるストアド プロシージャ プランのコピーは 1 つだけです。ここで、コンパイル処理の一部であるシリアル化が必要とされるようにすると、この同期の一部はコンパイル ロックを使用することにより実行されます。同じの操作を実行している多くの接続 areconcurrently ストアド プロシージャと、コンパイル ロック取得される必要がそのストアド プロシージャを実行するたびに、システム プロセス Id (Spid) オブジェクトのコンパイルの排他ロックを取得しようとするとそれぞれが、お互いにブロックを開始します。
詳細
ストアド プロシージャのリコンパイルは、ストアド プロシージャまたはトリガーにコンパイル ロックのための 1 つの説明です。ソリューションここを減らすために再コンパイルを排除します。ストアド プロシージャが再コンパイルする必要がありますが、最も一般的な原因の詳細については、再コンパイルの頻度を減らすことで、有用な情報には、次のマイクロソフト サポート技術情報資料を参照してください。
243586 ストアド プロシージャのリコンパイルのトラブルシューティング
コンパイル ロックが発生するもう 1 つのシナリオは、次の条件に該当する場合です。
  • ストアド プロシージャを実行しているユーザーは、プロシージャの所有者ではありません。
  • ストアド プロシージャ名は、オブジェクトの所有者の名前の完全修飾ではありません。
たとえば、"dbo"のユーザーには、オブジェクトのdbo.mystoredprocが所有しているし、別のユーザーでは、「ハリー、」コマンド「exec mystoredproc」を使用してこのストアド プロシージャを実行する、オブジェクトは所有者限定ではありませんので初期のキャッシュで検索オブジェクトの名前は失敗します。(がまだ不明 Harry.mystoredproc という名前の別のストアド プロシージャが存在するかどうか。したがって、SQL Server ことはできません dbo.mystoredproc のキャッシュされたプランが実行するために正しいものであることを確認します。)SQL Server はプロシージャをコンパイルの排他ロックを取得し、プロシージャをコンパイルする準備は、します。これは、オブジェクト id のオブジェクト名の解決も含まれます。SQL Server では、プランをコンパイルする前に SQL Server はこのオブジェクト ID を使用して、プロシージャ キャッシュのより正確な検索を実行して、所有者限定しなくてもコンパイル済みのプランを見つけることができます。

既存のプランが見つかると、SQL Server はキャッシュされたプランを再利用し、ストアド プロシージャは実際にはコンパイルされません。ただし、所有者修飾子がないことは、2 つ目のキャッシュ ルックアップを実行し、プログラムは、既存のキャッシュされた実行プランを再利用することを決定する前に、コンパイルの排他ロックを取得する SQL Server を強制します。ロックを取得し、検索し、このポイントに到達するために必要なその他の作業を実行するには、ブロックにつながるコンパイル ロックの遅延を導入できます。これは、所有者の名前を指定せず、プロシージャを同時に実行するストアド プロシージャの所有者ではないユーザーは、多くの場合は特にそうです。なる場合でも、コンパイル ロックを待機している Spid が表示しない場合は、所有者修飾子がないことができますストアド プロシージャの実行に遅れを生じさせる不必要に高い CPU 使用率が発生します。

この問題が発生した場合、SQL Server プロファイラー トレースで次の一連のイベントが記録されます。(キャッシュに関連するイベントをトレースするにする必要がありますを有効にする高度なイベントです。これを行うには、[ツール] メニューの [オプション] をクリックし、[すべてのイベント クラスです)。

イベント クラステキスト
RPC: 開始mystoredproc
SP:CacheMissmystoredproc
SP:ExecContextHitmystoredproc
SP: 開始mystoredproc
......

SP:CacheMissは、名前キャッシュのルックアップが失敗したときに発生します。次SP:ExecContextHitは、あいまいなオブジェクト名は、オブジェクト ID に解決した後、一致するキャッシュされたプランがキャッシュで発見最終的にことを示してください。環境によっては、 SP:CacheHitSP:ExecContextHit位置に表示されます。

コンパイル ロックのこの問題の解決策では、ストアド プロシージャへの参照は、所有者限定されていることを確認します。( Exec mystoredproc、代わりには、exec dbo.mystoredprocを使用します)。所有者修飾子では、パフォーマンス上の理由から重要ですが、追加のキャッシュ検索を防ぐためにデータベースの名前を持つストアド プロシージャを修飾する必要はありません。

されるブロックが原因で発生など、次のマイクロソフト サポート技術情報に定義されているブロックのスクリプトを使用してロックを検出できるコンパイルします。
251004 INF: SQL Server 7.0 のブロッキングを監視する方法
271509 INF: SQL Server 2000年のブロッキングを監視する方法
ブロッキング スクリプト出力に発生する可能性が、コンパイルのブロックのいくつか代表的な特性は、次のように。
  • や、ブロックして (通常) の Spid にlastwaittype LCK_M_X (排他) は、 waitresourceフォームの"タブ: dbid:object_id [コンパイル] を"「object_id」がストアド プロシージャのオブジェクト ID、です。
  • ブロックwaittype 0x0000 は、実行可能な状態があります。Blockees waittype 0x000e (排他的ロック) のある状態でスリープ状態です。
  • ブロッキング問題が発生した期間が長くなる場合がありますが、長い間、他の Spid をブロックしている SPID を 1 つはありません。ローリング ブロックがあります。1 回のコンパイルが完了するとすぐに別の SPID のヘッドのブロックを aseveral 秒以内というように役割を引き継ぎます。
Sysprocessesのスナップショットからこのような ofblocking の中には、次の情報です。
   spid  blocked  waittype  waittime  lastwaittype  waitresource   ----  -------  --------  --------  ------------  -------------------------      221    29      0x000e    2141      LCK_M_X       TAB: 6:834102 [[COMPILE]]   228    29      0x000e    2235      LCK_M_X       TAB: 6:834102 [[COMPILE]]    29   214      0x000e    3937      LCK_M_X       TAB: 6:834102 [[COMPILE]]    13   214      0x000e    1094      LCK_M_X       TAB: 6:834102 [[COMPILE]]    68   214      0x000e    1968      LCK_M_X       TAB: 6:834102 [[COMPILE]]   214     0      0x0000       0      LCK_M_X       TAB: 6:834102 [[COMPILE]]
Waitresource列 (「6:834102」) で、6 は、データベース ID と 834102 は、オブジェクトの id。このオブジェクト ID は、(「タブ」ロックの種類) があってもテーブルにない、ストアド プロシージャに属することに注意します。

注:
  • SQL Server 2005 を使用する場合は一連のビューとして SQL Server 2000年のシステム テーブルの多くが実装されました。これらのビューは、互換ビューと呼ばれていて、下位互換性のみを目的としています。互換性ビューでは、SQL Server 2000年で使用可能な同じメタデータを公開します。SQL Server 2000年システム テーブルと、SQL Server 2005 システム ビューの間のマッピングの詳細については、SQL Server 2005 Books Online の [マッピング SQL Server 2000年システム テーブルを SQL Server 2005 システム ビュー] のトピックを参照してください。
  • ストアド プロシージャ名は「sp _」プリフィックスで始まるし、master データベースでは、キャッシュの場合でも、所有者で修飾するストアド プロシージャの実行のたびにヒットする前にSP:CacheMissが表示されます。Sp _ のプレフィックスは、SQL Server のストアド プロシージャには、システム ストアド プロシージャとシステム ストアド プロシージャで別の名前解決の規則があるためにです。(「推奨」場所は、master データベースでは)。ユーザー作成のストアド プロシージャの名前は、「sp _」で開始する必要がありますできません。
  • 場合は、所有者限定プロシージャ実行すると異なる場合、所有者限定プロシージャが作成されたとしてよりも、所有者限定プロシージャできます、CacheMissを取得またはコンパイル ロックを要求するが、最終的にキャッシュされたプランを使用します。したがって、この手順を実際に再コンパイルはしません、多くのオーバーヘッドは発生しません。特定の状況では、コンパイル ロックを要求、「ブロッキング チェーン」の状況として、プロシージャが作成されたよりも、別の場合と同じ手順を実行しようとして多くの Spid がある場合。これは、サーバーまたはデータベースで使用されている照合順序、並べ替え順序は関係ありません。この現象の理由は、キャッシュ内のプロシージャの検索に使用されているアルゴリズムは、大文字と小文字が異なる場合に変更できるパフォーマンス上の理由により)、ハッシュ値に基づいていることです。

    回避策は、削除し、手順と同じ大文字と小文字を持つプロシージャを作成するのには、アプリケーションによって実行されました。同じ大文字と小文字を使用するすべてのアプリケーションからプロシージャを実行することも確認することができます。
  • RPC としてのではなく、言語イベントとしてストアド プロシージャを実行しようとすると、SQL Server する必要があります解析し言語のイベント クエリをコンパイル、クエリが特定のプロシージャを実行し、キャッシュ内でそのプロシージャのプランを検出しようとするは、試行されているを確認します。SQL Server の必要があります解析およびコンパイル言語のイベントは、この状況を避けるためには、RPC として SQL にクエリを送信することになっていることを確認します。

    詳細については、Books Online の「ストアド プロシージャの作成」の記事「システム ストアド プロシージャ」セクションを参照してください。


既知の問題

プランのキャッシュを防ぐことができますが、既知の問題を以下に示します。
  • BLOB 変数は、ストアド プロシージャのパラメーターとして使用します。詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料をご参照ください。
    2380435 FIX ストアド プロシージャのクエリ プランがキャッシュされていない場合は、ストアド プロシージャを使用して、BLOB 変数と、Microsoft SQL Server 2008年での文字列関数で、変数を使用
  • ストアド プロシージャまたはクエリ バッチ内で開いている対称キーを使用します。詳細については、次の MSDN 記事を参照してください。

警告: この記事は自動翻訳されています

プロパティ

文書番号:263889 - 最終更新日: 07/03/2016 14:01:00 - リビジョン: 4.0

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbinfo kbmt KB263889 KbMtja
フィードバック