ここで何が起こっているのかを正確に理解しようとしています。選択/更新の組み合わせがデッドロックを引き起こす可能性があることを認識しています-この場合、長い待ち時間です。
シナリオは次のとおりです。クエリ A は、3 つのインデックスを使用する選択ステートメントです (非常に単純化されています)。
select * from ProblemTable Where Plan_Id=@planId and
Date_entered Between @startDate and @endDate and nabp=@nabp
インデックスはすべて非クラスタ化されています:
- Plan_Id
- Date_Entered
- Plan_Id、nabp
すべてに ProblemTable.Unique_Id の「出力」があります
クエリ B は、2 つのインデックスを使用する更新ステートメントです。
インデックスは次のとおりです。
- クラスター化されていない Date_Entered ASC、Source ASC、DataStartOffset ASC
- インデックス 1 のインデックス検索の結果で使用される Unique_Id のクラスター化インデックス。
更新クエリ:
Update ProblemTable Set ProcessingTime=@processingTime
Where dateadd(dd, -datediff(dd, date_entered, 1), 1) =
dateadd(dd, -datediff(dd, getdate(), 1), 1)
and DateSource = 'xxyyzz' and DataStartOffset = 93148143
私は知っています.. dateaddは間抜けです。私はこれを書いていません:)
したがって、これはクエリ A とは別のインデックスをスキャンしますが、Date_Entered も使用します。このような状況のため、長い待ち時間が発生し続けます。デッドロックは発生していないように見えますが、各クエリが通常数秒で実行される場合、5 分以上の待機時間が発生する可能性があります。
これは、INSERT into ProblemTable でも発生することに注意してください。
したがって、SELECT stmt は、NC インデックス検索に基づいて最終的に選択することを決定した行のロックを取得し、更新ステートメントは、NC インデックスでの検索から返された行のロックを取得しようとすると推測しています。しかし、デッドロックが発生していないのに、なぜ長い時間がかかるのでしょうか?
質問は基本的に次のとおりです。
1 デッドロックではなく長い待機時間はなぜですか? 2. 何が原因ですか?
ここで利用できる十分な情報はありますか?
EDIT 1両方のクエリはかなり高速で、どちらもこれほど長くかかりません。長い時間は、ここでの「何らかの」未知のロックの問題の結果です。進行中の他の明示的なトランザクションはありません。