TableB
toの結合を実行するストアド プロシージャがありますTableA
。
SELECT <--- Nested <--- TableA
Loop <--
|
---TableB
同時に、トランザクションでは、行が に挿入されTableA
、次に に挿入されTableB
ます。
この状況は、ストアド プロシージャ select が TableB から行を取得し、insert がTableAに行を追加し、それぞれが他のテーブルを手放すことを望んでいるため、デッドロックを引き起こすことがあります。
INSERT SELECT
========= ========
Lock A Lock B
Insert A Select B
Want B Want A
....deadlock...
ロジックでは、INSERT
最初に行をAに追加してからBに追加する必要がありますが、個人的には、SQL Server が結合を実行する順序は気にしません。
デッドロックを修正するための一般的な推奨事項は、全員が同じ順序でリソースにアクセスできるようにすることです。しかし、この場合、SQL Server のオプティマイザは、逆の順序が「より良い」と言っています。別の結合順序を強制して、クエリのパフォーマンスを低下させることができます。
しかし、私はすべきですか?
使用したい結合順序で、オプティマイザーを今も永遠にオーバーライドする必要がありますか?
または、エラーネイティブ エラー 1205をトラップして、選択ステートメントを再送信する必要がありますか?
問題は、オプティマイザーをオーバーライドして、最適でないことを行うと、クエリのパフォーマンスがどれほど低下するかということではありません。問題は、より悪いクエリを実行するよりも、自動的に再試行する方がよいかどうかです。