2011-10-10 10 views
0

私は非常に大きなデータベースを持ち、60ギガバイトを少し超え、数百万行のテーブルが多数あります。私はいくつかのタイムアウトエラーが発生するので、私は私のコードデザインのいくつかを再考しています。SQL Serverのパフォーマンス:削除/挿入Vs選択/更新

現在、私のpseduoコードはこのようなものです:人= 123(約200行を削除します)ここで

がテーブルから削除

それから私は、更新されたデータ(再び、200行)を再挿入します。時間の影響を受けるので、データは常に異なっています。

私が代わりに挿入のため、更新を行うことだった場合、私は(私はC#でORMを使用しています)最初の行を選択する必要があると思います。

tl; dr 私はちょうど疑問に思っています、簡単な質問、より費用対効果の高いものです。 選択/更新または削除/挿入?削除/挿入で

+1

ORMではなく、この非常に仕事のための.NET? –

+0

テーブル構造とは何ですか?クラスタリングキーを更新していますか? –

+0

Ah - 60ギグはvldbではありません。それは... 15年前だった。今日は普通です。 – TomTom

答えて

6

1)/とにかく挿入

2)あなたはUPDATEとカーディナリティの違いを処理する方法を?つまりperson = 123には削除する行は200行ありますが、挿入する行は199行だけです。更新はこれを処理できません。

MERGEステートメントとtable valued paramneterに新しい値を使用することをお勧めします。もちろん、ORMはこれを処理することはできませんが、 'パフォーマンス'と言いますが、 'パフォーマンス'と 'ORM'という用語は同じ文章では使用できません...

0

、あなたは二回データベースへの書き込みをされます。削除する1回と挿入する1回。また、単一のトランザクションでプロセス全体を適切にラップしていない限り、これらのトランザクションを別々にログに記録します。

SQLプロファイラで両方のメソッドをテストして結果を見ることはできますが、9/10の更新が速くなります。

キャビネットの可能性がありますが、影響を受けるレコードを見つけるために完全なテーブルスキャンを実行しないように、人物のキーが索引付けされていることを確認します。 @Munduが言うように

最後に、あなたの代わりにORMのADO.NET経由でパラメータ化クエリを使用してこれを行うことができます。あなたは、あなたの更新が削除として内部的に処理されたクラスタ化インデックスキーの一部である任意の列を更新する場合は

関連する問題