5

SQL Server 2012 でデッドロック状態になります。

SQL Server Profiler を実行した後、次のようなデッドロック グラフが表示されました。

デッドロック グラフ

マウスをプロセス (楕円形) の上に移動すると、両方のプロセスで同一の PrepareStatement クエリが表示されました (私は JDBC を使用しています)。

私が使用しているクエリは次のとおりです。

MERGE INTO MA4TB_MT_LOG_MSG  USING (VALUES (1)) AS S(Num) ON ( MSG_ID = ? )
            WHEN MATCHED THEN
                UPDATE SET 
                    DIST_DATE   = ?,
                    DIST_CODE   = ?
            WHEN NOT MATCHED THEN
                INSERT (
                    MSG_ID, DIST_DATE, DIST_CODE
                ) VALUES (
                    ?,?,?
                );

気になるのは、キーロックリソースボックスの下のインデックス名です。

MA4TB_MT_LOG_MSG テーブルの下に「1」というインデックスがありません。

MSG_ID は MA4TB_MT_LOG_MSG の主キーであり、DIST_DATE、DIST_CODE にはインデックスがありません。

この行き詰まりの状況に関するアドバイスをいただければ幸いです。

前もって感謝します、

4

4 に答える 4

1

SQL プロファイラーは、そのグラフ/マウスオーバーに表示されるよりも多くの情報を生成します。その情報は、問題をより明確にする場合としない場合があります。これを試して:

  • グラフを表示するプロファイラーの行を選択します
  • 「コピー」を実行します (ctrL+C、またはメニュー オプション)。
  • これをテキスト エディター (SSMS クエリ ウィンドウなど) に貼り付けます。
  • 必要なのは、プロファイラーの「テキスト」列の XML コンテンツです。それ以外はすべて削除します
  • この XML を XML エディターで開きます (読みやすいものであれば、Microsoft の XML メモ帳を使用します)。
  • ドリルダウンします。少し時間がかかりますが、レイアウト (階層、タグ名など) のこつをつかめば、物事は明確になるはずです。
于 2014-04-22T22:29:00.243 に答える
0

「インデックス名: 1」はクラスター化インデックスのオブジェクト ID を参照していると思います

于 2014-04-19T17:53:53.063 に答える
0

Lock グラフは、テーブル全体がロックされていることを示しているようです。

基本的に、あなたが書いたMERGEステートメントを確認することをお勧めします。適切なフィルタ条件があることを確認してください。データ アクセスが高速になり、ロック期間が短縮されるように、適切なインデックスを作成するようにしてください。トランザクションが必要な場合にのみ実装します。MA4TB_MT_LOG_MS の上にデッドロック シナリオを作成しているプロセスを理解し、そのコードに対処してみてください。ロックの選択性 (つまり、テーブル ロックの代わりに行\ページ ロック) と期間を増やします。

見所満載!

于 2014-04-19T17:51:50.693 に答える