0

入ってくるデータを受け取り、それを分割して、データベースの適切なフィールドに送信するラボ処理ソフトウェアを作成しました。DBテーブルは非常に大きく、フィールドがたくさんあります。データを挿入する前に、データを挿入する前に重複チェックを実行します(複数のソースから繰り返しデータを取得します)。

システムは、受信データを解析し、linq-to-sqlオブジェクトを入力することで機能します。重複チェックは、linq-to-sqlオブジェクトのリストに対して.where操作を実行して、テーブルにまだ存在しないオブジェクトを選択することで機能します。

例えば ​​...

input=list (of TableA) 'linq to sql objects
output=input.where(function (x as TableA) not myDb.TableA.any(function(l as table) l.name=x.name, l.dob=x.dob..etc for 10 fields..).tolist

構文は少し難解ですが、これが、linqでsqlオブジェクトとデータベースレコードへの内部結合を実行するために見つけることができる唯一の方法でした。この方法を使用する前は、行ごとに重複チェックを実行していましたが、これは非常に低速でした。

私が理解しているように、Linqはこのlinqステートメントをサーバー上で実行されているsqlステートメントに変換しています。

私の質問は、これをもっと速く実行する方法はありますか?重複排除を実行して従来のクエリを実行するためにSQLステートメントを書き出すと、さらに速くなると期待する理由はありますか?このステートメントはSLOWですが、機能し、単体テストされ、重複をブロックします。私はより速く、同等にきれいなもの(難しいことではない、私は知っています)またはよりきれいなものを探しています...

4

2 に答える 2

1

name、dob、および ... に基づいて、テーブルに一意のインデックスを定義できます。各挿入は、正常に実行されるか、一意の制約違反の例外が発生する可能性があります。したがって、挿入前にチェックする必要はありません。一番ストレートなやり方だと思います。

于 2012-11-29T23:52:19.937 に答える
0

他のプロセスが SQL テーブルに追加していない場合は、プログラムの開始時にテーブルを HashSet に読み込むことができます。ローカル HashSet を確認します。HashSet にない場合は、SQL テーブルと HashSet に追加します。HashSet ルックアップは、同じ物理ボックスで実行されている場合でも、SQL クエリよりも約 100 倍高速です。私はこれをいくつかの大きな負荷に使用します。

短期間だけ重複を取得する場合は、開始時にテーブルからの履歴の読み込みをスキップするか、最後の X のみを読み込むことができます。その HashSet を確認し、HashSet に見つからない場合にのみ、SP を使用して挿入またはスキップします。 . そして、定期的に HashSet を X に切り捨てます。

于 2012-11-30T22:01:40.290 に答える