2011-01-27 8 views
0

特定のデータがデータベースのtable1に存在するかどうか、またはforループ内にないことを確認する必要があります。それが存在するならば、アクションもforループも継続します。それ以外の場合は、table1にデータを追加する必要があります。データベース内のデータ存在をループ内でチェックするベストプラクティス?

したがって、すべての反復で、私はデータベースを見ています。私は時間がかかると信じています。

このようなタスクを実行するためのベストプラクティスはありますか?

答えて

1

データベーステーブルにレコードの存在をどのように確認しますか?ほとんどの場合、あなたはそれを地元のIDなどと照合します。

これが当てはまる場合は、テーブルにクエリを行い、すべてのIDを選択してHashtable(Dictionary in .Net)に格納します。 (データベースに何百万ものレコードが含まれている場合、これは実際的ではないかもしれません)。テーブルのレコードが存在するかどうかを判断するのは、辞書のキーが存在するかどうかをチェックするという単純な問題です。これはO(log n)操作であり、高価なデータベースラウンドトリップよりもずっと優れています。

次は、テーブルに追加する必要があるレコードを覚えておくことです。これは、追加する必要があるかどうか、(ローカル)重複が含まれないことが保証されているかどうかを確認するローカルで重複するレコードがあるかどうかによって異なります。

可能な重複がない単純なケースでは、適切なキーで辞書に追加してから、O(1)であるDictionary.Valuesを後で照会するだけで、おそらくそれは速いです。大量のために挿入が非常に高速になる必要がある場合は、SQL一括挿入を使用することを検討してください。

テーブルが大きすぎてIDをローカルにキャッシュできない場合は、挿入を実行するためのストアドプロシージャを実装し、実際に挿入を実行するかどうかを決定する論理を持つかどうかを検討します。これは、通常かなり高価な第2回の往復を取り除くでしょう。

RDBMSがSQL Mergeコマンドを実装している場合(MS SQL Serverを使用していると仮定します)、すべてのデータを一時テーブルに挿入し、ターゲットテーブルとマージします。これはおそらく最速の解決策です。千万(潜在的に記録さ)の操作を行うデータが10万行を持つ例えば

+0

これは良い解決策ですが、table1に3000以上のレコードがある場合はどうなりますか? – odiseh

+0

3000は実際には何も心配することはありません。何百万というレコードがあれば、私はSPアプローチに向いています。 –

+0

ありがとう、Mr. Johannes – odiseh

0

どのくらいのデータ、そしてどのようなSQLの実装はここに大きな違いを生むことができます...

、、、各行に1つがかかります大量のオーダーは、例えば、バルク操作で一時的なテーブルに同じデータをアップロードする、例えば:

  • SQLを使用している場合はバルク・コピーAPIを使用します。
  • データを差分するために左外部結合を実行して、一回のバッチ操作で差を挿入します。