2017-01-25 6 views
0

テーブルに多数のレコード(約2〜3百万)を挿入する必要があります。しかし、私たちは、後で参照できるように、主キー、外部キーおよび非ヌル違反の無効なレコードを別のエラー・テーブルに検証し、分離する必要があります。私の研究では、SQLサーバーの一括挿入は挿入にはうまくいくが、悪いデータレコードをフィルタリングする最良の方法を理解することはできない。間にステージングテーブルを持つことは助けになりますか?ステージングテーブルに対していくつかのキューを使用して違反をチェックすることもできますが、実際のテーブルに、別のインサートを挿入するか、またはマージするかのどちらかを使用して良いレコードをロードする必要があります。私はそれが2倍の挿入を行うのに似ているので心配です。データ検証付き一括挿入

大量の挿入を行うために.net sqlbulkcopyを使用する予定であり、明確なエラー報告もありません。

もっと効率的なソリューションを教えていただけますか?

EDIT:このアプローチが唯一の解決策である場合、2番目のインサートにはどのような方法が最適ですか?挿入されていますか...選択かマージですか?彼らはBULK INSERTの効率とスピードにマッチしますか?それとも他に良い選択肢がありますか?

ありがとうございます!

+0

これにはいくつかのアプローチがあります。http://stackoverflow.com/questions/1004525/sqlbulkcopy-error-handling-continue-on-error – TheGameiswar

+0

@TheGameiswarリンクをありがとう。私はそれを通り抜けましたが、実際にはこのシナリオに当てはまると私は思っています。しかし、ソースからステージング・テーブルへの1つのバルク・インサートとステージング・テーブルからターゲットへの1つのバルク・インサートを効率的に行うかどうかはわかりません。最適化のチャンスがあるかどうかを知りたかっただけです。 –

+0

@TheGameiswarは、第2ステップを実行するための最良の方法についての意見収集に関する質問を編集しました。ありがとう! –

答えて

1

個人的には、2/3Mレコードを大量には考えません。 数秒でデータが必要な場合を除き、Single(Non-Bulk)挿入が適切に機能します。

srcのデータ品質が気になる場合は、最初にstgテーブルにロードしてから、「Soft RI」を実行します.SQLを使用してPK、UQ、FKなどを確認してください。 数値/非数値型または悪い日付型の問題が心配な場合は、すべての列に対してStgテーブルVARCHAR(8000)を作成し、テーブルから読み込むときにTRY_CONVERTを使用します。

データがSTGに格納されると、適切な行だけを簡単にフィルタリングし、不良行を詳細にレポートできます。

+0

@ johnMcTigheコメントありがとうございます。私たちのSLAはおおよそ1分間に100万レコードになるでしょう。バルクインサートのほうが良いのではないでしょうか?また、悪いレコードを分離すること以外にも、良いものを実際のテーブルに挿入する必要があります。どのSQLステートメントがそのステップにとって最も効率的なのでしょうか? –

+0

私はこれを試してみたいです:STGへの挿入 - これは、大量の行がロードされる(PK、制約なしなど)ことが合理的であるため、一括挿入できます。次に、何らかの理由で無効なStgの行を更新します。これは複数のパスにすることができます。後で別のクエリとしてBad行の単純な挿入/選択 - レポートとして良好な行を挿入します。これが十分に速く実行されれば、素晴らしい! –

+0

@ john McTighe私はそれが十分に速いことを願っています!他の人に考えがあるかどうかを確認するために、この質問を未回答のままにしておきます。そうでない場合は、答えとしてあなたのマークを付けます。助けてくれてありがとう! –