2011-02-10 3 views
1

150K行を含むWeb上のユーザーからファイルをインポートしているため、データベースに追加される約1.6Mのアイテムが生成されます。SQLインジェクションから保護し、パフォーマンスを向上させるために、一括挿入ステートメントにパラメータを追加するにはどうすればよいですか?

最初にプライマリレコードを追加してから、最初のレコードの後に​​提供されたキーで子を追加します。

私はクエリをプリコンパイルして再利用することができますが、それらをまとめてグループ化したいと思いますが、その時点でクエリをパラメータ化できないことが懸念されます。

現時点では、クエリメソッドを使用して約300行または3000クエリ/秒でインポートしています。

+0

大きなデータの読み込みでパフォーマンスがわかる唯一の方法は、http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspxを使用することですが、これは役に立ちません最初のステップでは、外部キーを挿入して外部キー値を生成します。それは子どもの行を助けるかもしれません –

+0

私はおそらくそれを処理するために一時テーブルを使用する考えがあります。おそらく、より大きなセットに行のインデックスを追加し、実際のテーブルにデータを移動する時間が来たときにそれらを実際のIDで更新します。私はそれはうまくいくと思うが、まだ大きな問題を解決していない。 – Middletone

答えて

0

データを読み込む方法の制約についてはわかりませんが、データベースに一括インポートするにはいくつかの方法があります.->Performing Bulk Copy Operationsです。データインポート処理とを操作するとき、私はいつもそれが役に立つのフェーズに分割してすることが分かっ:

  1. インポート相 - あなたの状況に応じて利用可能なさまざまな異なるバルク方法論
  2. ステージング段階 - プロセスの作業。例えばデータ検証、キー関係構築、データスクラブなど
  3. 「ライブ」テーブルへの最終挿入。 (願わくは設定基づい挿入)

論理作業にほとんどの最初のパスでデータアップの全てを選択することは非常に効率的で、かつ質量アンステージングエリアに移動することができます。その目的のためにテンポラリ・テーブルまたは永続的なステージング・テーブルに入る。その後、ライブテーブルの最後の家に大量のデータを挿入する前に、すべてのデータを適切に構造化して整理するために、データの処理作業を行うことができます。これにより、1つ以上の中間ステップを持つことによって、悪意のあるデータやSQLインジェクション攻撃から断熱層を得ることもできます。

大規模なステージングダンピング場に大量インポートするために必要なロジックが非常に少ないため、このように分離することで、一括インポートタスクをできるだけ早く行うことができます。しかし、適切なデータをスライスアップするために必要なロジックを適用することができます。さらに、ステージング段階で複数のステップを実行する必要がある場合は、これを中断してより多くの小さなステップが必要になり、最大/最小のパーツの最適化に重点を置くことができます。

状況によっては、ステージングフェーズになってライブテーブル内のデータと一致するようにデータを構造化する方法がある場合は、大きなセットとして挿入することができます。最後の挿入の前にステージング段階でPK-> ForeignKey関係を構築できれば(他のデータ処理作業も同様)、反復挿入から1つの大きなバルクセット挿入に進むことができます。set based is usually a very good thing。それはあなたのシステム/制約がそうすることを許すならば、もちろんです。

あなたの状況に当てはまるものがあるかどうかわからない、私があなたが求めていたものから離れているなら、うまくいけばそこに有用なものがあります。

+0

私はこれを受け入れているのは、コンセプトが正しいため、質問のパラメータに対処していなくても従うべきだからです。 – Middletone

関連する問題