2

HTML5 キャンバスを使用する HTML5 フロント エンドがあります。キャンバスには、ユーザーが操作 (移動) できる一連の画像が表示され、[保存] をクリックします。「保存」は、x、y 座標などの画像データのリストを asmx Web サービスに送信します。

現時点では、セッションのすべてのレコードを削除し、新しいレコードを再挿入していますが、セッションが以前に保存されていない場合は挿入しています。

私の最初の質問は、削除して挿入すること、または単に更新を実行することをお勧めすることです。計算量が少ないのはどれですか?

2 番目に、すべてのセッション データがコミットされていることを確認したい。つまり、46 行のデータを送信した場合、それらが書き込まれていることを確認したい。削除/挿入のシナリオでは、挿入が失敗する可能性がありますが、削除が続行される可能性があります。

トランザクションを使用してこれをどのように達成しますか。

現時点では、エンティティ フレームワークを使用してセッション データを選択し、それを削除してから、データをもう一度挿入し直しています。

どんなポインタでも大歓迎です。

4

2 に答える 2

1

私の最初の質問は、削除して挿入するか、単に更新を実行することをお勧めすることです。計算量が少ないのはどれですか?

更新は、削除して挿入するより安価です。その理由は、ボトルネックがディスク (計算ではない) にあるためです。挿入と削除は、ディスク上のページにバイトを割り当てて解放し、おそらく 1 つまたは 2 つのインデックスを更新する必要があります。更新すると、それらはそのまま残り、数バイトしか変更されないため、IO が少なくなります。その上、挿入と削除は 2 つの操作 (+ これが影響するすべてのインデックス) であるのに対し、更新は 1 つだけです。(ところで、ロギングにはもう少しオーバーヘッドがあります)

sql2008 以降を使用している場合は、テーブル値パラメーターを使用できます。更新セット全体を 1 回のラウンド トリップで sql に送信できるため、これらは説明どおりにうまく機能するはずです。通常の更新ステートメントを使用する場合、46 個のステートメントを実行する必要があります。

これを本当に調整したい場合は、TVP と merge ステートメントを組み合わせて、更新と挿入の混合を 1 回の操作で処理することも検討してください。

そうは言っても、コードで最も簡単に機能するものを使用することをお勧めします。パフォーマンスに問題がない場合は、修正する必要はありません。

2 番目に、すべてのセッション データがコミットされていることを確認したい。つまり、46 行のデータを送信した場合、それらが書き込まれていることを確認したい。削除/挿入のシナリオでは、挿入が失敗する可能性がありますが、削除が続行される可能性があります。

更新または削除/挿入のいずれかで、実際にトランザクションを使用できます。

begin tran 

delete * from table where some condition

insert into table (value1, value 2) values (1, 2), (3, 4) .. 

commit tran

これは全体として成功するか、データベースを変更しません。これは、テーブル値パラメーターを使用する場合にも当てはまります。

于 2013-08-30T21:48:08.323 に答える
0

TVP と組み合わせてMERGEステートメントを確認してください

また、一時テーブルを作成し、SqlBulkCopyクラス (もちろん MERGE が続きます) を使用して効果を上げました。SqlBulkCopy は通常、より多くの行に使用されますが、(TVP よりも) 簡単に使用できるため、これらの条件で使用しても害はありません。

もう 1 つの方法は、一時テーブルを作成し、そこに多数の挿入を行ってからマージすることです。すべての命令を 1 回の往復で送信することにより、良好なパフォーマンスが得られます。必要に応じて、46 個のマージ ステートメントを実行することもできます。値のインライン選択を行う必要があります。

MERGE はアトミックであるため、すべての場合においてトランザクションは適切ですが、最初の 2 つは厳密には必要ではありません。より多くのことを始めた場合に備えて、まだ良い習慣です。

于 2013-08-30T23:39:15.617 に答える