2011-12-23 10 views
3

比較的単純な問題です。
Table AID int PK、ユニークName varchar(500)、およびcola, colbなど
Table BTable Aへの外部キーを持っています。TSQL大規模なリレーショナルデータの挿入、外部キー昇格

したがって、アプリケーションでは、テーブルAとテーブルBの両方のレコードをメモリ内のDataTableに生成しています。

非常に多数の「クライアント」でこれらのレコードが何千も生成されています。

最終的に私たちはこれらのレコードを保存するように呼び出します。ただし、テーブルAのレコードはすでにデータベースに存在している可能性があるため、既存のレコードの主キーを取得し、欠落したレコードを挿入する必要があります。次に、正しい外部キーを使用してテーブルBのすべてのレコードを挿入します。

提案ソリューション:

私が欠落しているレコードを挿入し、TableVarAに行セットとしてオープンし、すでに存在するレコードの主キーでTableVarAを更新するために、SQL ServerのXML文書を送っ検討していたと出力をTableVarNewに設定した後、のNameとプライマリキーをTableVarAから選択します。

次にコードで正しいFKをメモリにTableBに入力し、SqlBulkCopyを使用してこれらのレコードをすべて挿入します。

これは良い解決策のようですか?もしそうなら、TableBのメモリにFKを設定し、返されたDataSetの主キーと一致させる最良の方法は何でしょうか。

答えて

2

は計画のような音 - が、私は(単一のメモリ内のテーブル/テーブル変数には十分なものでなければならない)Table Aの取り扱いが簡単になることができると思います。

  • Table A
  • のためのすべての行が含まれている TableVarAを持っています
  • 更新彼らのIDを持つすべての既存の行のためのID(単一のSQL文でなんとかする必要があります)
  • Table Aにすべての非既存の行を(まだ空IDを持っていること)を挿入し、そのをメモします

これは、すべて単一のテーブル変数に発生する可能性があります - あなたの周りのものをコピーする必要があり、なぜ私は表示されません....あなたが言うように、あなたが、あなたのTable Aを扱ったら

、更新Table Bの外部キーと一括してそれらの行を挿入します。私は上で非常に明確ではないよ何

はどのようにTable B参照Table Aです - あなたはそれがFKを持っていたと述べたが、あなたはそれが(IDに仮定した場合)にあったものを、列指定されていませんでした。それでは、あなたの行は、新しい行のためにを参照しているTable Bから、まだ挿入されていないので、IDはまだTable Aにありませんか?

+0

これは、固有の名前で行われます。 表Aを挿入する部分は、変更することを話していますか?これは、両方のテーブルvarsをunionで選択する代わりに、TableVarAをTableVarNewの結果で更新し、それをDataSetとして返しますか? – TrevDev

+0

また、私はあなたの答えを見た:http://stackoverflow.com/questions/3006472/fast-insert-relationalnormalized-data-tables-into-sql-server-2008-database それはかなりスマートに聞こえたが、それは思われた多くのことが起こるようなものを最適化するのではなく、データのインポートにもっと関連しています。 IE:多くのクライアントがたくさんのレコードをたくさん送るでしょうから、これらのレコードをすばやく挿入することを確実にすることは非常に重要です。 – TrevDev

+0

@Thx:少なくとも2つ(または3つ)の異なる「TableA」変数を使用して物をマージすることを意図していたという事実が気に入らなかった。 1つのTableA変数で必要な操作をすべて実行できると思います。また、「SqlBulkCopy」を使用してステージングテーブルにすべてをプッシュしてからすべての修正を行うというアイデアは、あまりにも悪い考えではありません。 –

0

これは完全な回答よりもコメントですが、私は部屋が不足していますので、答えの基準にならないと投票しないでください。

私の心配は、欠けているキーのセットを評価し、一括して挿入すると、そのキーがその間に他の場所に追加されてしまう危険性があるということです。あなたはこれが多数のクライアントから来る可能性があると述べたので、これは起こるでしょう。はい、あなたは大きなトランザクションでそれをラップすることができますが、大きなトランザクションは豚が他のクライアントをロックアウトします。

私の考えは、PKが削除される危険性がないと仮定して、一括して鍵を持つ人に対処することです。 TVPは効率的ですが、どちらが処理されたかについての明示的な知識が必要です。私はあなたが最初にNameを検索して、存在するPKのリストを取得し、それをTVP経由で処理する必要があると思います。

必要に応じてPKを作成するストアドプロシージャを使用して、残りの部分を一度に1つずつ処理します。

何千ものレコードが恐ろしい(何百万もの)ものではありません。恐ろしい部分である多数の「クライアント」。

関連する問題