効果的な方法で処理する方法例外をスローするためのキー挿入を複製します
-
29-10-2019 - |
質問
私のケースシナリオは、パラメーターを手順に渡し、挿入のみを行います。しかし、2つのスレッドは同じ値を渡そうとするかもしれません。
例外を投げてロックの量が少ないこの状況を処理するにはどうすればよいですか?
私のパフォーマンス要件は、1秒あたり少なくとも10Kインサートです。
編集: 列はユニークです。挿入前にタイムスタンプが変更される可能性があります(調整)。
解決
無視された重複キーオプションを使用してテーブルにインデックスを作成します。重複する行を挿入せず、エラーも介しては挿入されません。
例えば
create unique index i1 on #tmp(id) with ignore_dup_key
insert into #tmp values(1,"A")
2> go
(1 row affected)
1> insert into #tmp values(1,"A")
2> go
Duplicate key was ignored.
(0 rows affected)
他のヒント
試してみてください マージ 声明
MSDNから。一般的なシナリオは、一致する行が存在する場合はテーブル内の1つ以上の列を更新するか、一致する行が存在しない場合は新しい行としてデータを挿入することです。これは通常、適切な更新と挿入ステートメントを含むストアドプロシージャにパラメーターを渡すことによって行われます。マージステートメントを使用すると、両方のタスクを1つのステートメントで実行できます。
パフォーマンスの懸念については、ページもあります マージステートメントのパフォーマンスを最適化します
として @Martin Smith 良い解決策があると指摘しています - それは私の質問に反していますが、それは背後に十分な理由があると思われます。あなたが見つけることができる元の答え ここ 投稿者 @gbn.
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
真剣に、これは最も速く、ロックなしで最も同時に、特に大量のものです。 Updlockがエスカレーションされ、テーブル全体がロックされている場合はどうなりますか?
あなたが見つけることができるポール・ニールセンによる元のテキスト ここ. 。 - レッスン4。
誰かが私のものと同様の問題を抱えているなら、それを見てもいいです。