何百万ものレコードをフラットファイルからSQL Serverに挿入する落とし穴は何ですか?

StackOverflow https://stackoverflow.com/questions/141556

質問

パイプで区切られた約230 MBのサイズのtxtファイルを開くWindowsフォームアプリケーションを作成する旅に出かけようとしています。このアプリは、このデータをSQL Server 2005データベースに挿入します(明らかにこれを迅速に行う必要があります)。このプロジェクトにはc#3.0と.net 3.5を使用しています。

私はアプリを求めているのではなく、ここでいくつかの共同アドバイスや潜在的な落とし穴をアドバイスしています。私が集めたサイトから、SQL一括コピーが前提条件であると考えるべきことはありますか(フォームアプリでtxtファイルを開くだけで大きな努力になると思います;多分それをblobデータに分割しますか?) / p>

ありがとうございます。必要に応じて、質問を明確にするために編集します。

役に立ちましたか?

解決

winformsアプリを作成する必要がありますか? SSISを使用する方がはるかに簡単かつ高速です。特に一括挿入タスクで利用可能な組み込みタスクがいくつかあります。

また、チェックする価値がある SQL Server 2005でのフラットファイル一括インポートメソッドの速度比較

更新:SSISを初めて使用する場合は、これらのサイトのいくつかをチェックして、迅速に追跡してください。 1) SSIS制御フローの基本 2) SQL Server Integration Servicesの使用開始

これは別の方法です: ExcelファイルをSQL 2005にインポート

他のヒント

これはストリーミングの試みです。

可能であれば、ここでトランザクションを使用しないでください。トランザクションコストは単純に高すぎます。

これで、ファイルを一度に1行ずつ読み取り、一度に1行ずつ挿入します。失敗した挿入を別のファイルにダンプして、後で診断し、失敗した場所を確認する必要があります。

まず、ストリーミングが正常に機能していることを確認するために、数百行の一括挿入を試してみて、必要なものをすべて開くことができます。

SqlBulkCopy を使用してみてください。 。 「任意のデータソース」からプルできます。

補足として、テーブルのインデックスを削除し、一括挿入操作後にインデックスを再作成する方が速い場合があります。

完全復旧から一括ログへの切り替えを検討する場合があります。これにより、バックアップを適切なサイズに保つことができます。

SSISをお勧めします。数百万件のレコードを読み取り、それらを比較的短時間でクリーンアップできます。

SSISを理解するために少し時間をとる必要がありますが、それは報われるはずです。 SOには他にもいくつかのスレッドがあり、おそらく役に立つでしょう:

SQL Serverに大量のデータを一括挿入する最速の方法は何ですか(C#クライアント)

SSISの推奨学習教材は何ですか

C#からパッケージを作成することもできます。 3GLの「マスターファイル」を読み取るC#プログラムがあります。レガシーシステムから(関連プロジェクト用のAPIを使用してオブジェクトモデルに解析)、パッケージテンプレートを取得し、それを変更してETL用のパッケージを生成します。

実際に話しているデータのサイズはそれほど大きくありません。効率の問題が何であるかはわかりませんが、挿入するのに数時間待てば、各行を一度に1つずつ挿入するという単純な手法でこれがどれほど簡単に達成できるか驚くかもしれません。 。一度に数千行をまとめてバッチ処理してSQLサーバーに送信すると、かなり高速になる場合があります。

考えられるほど高速にする必要がない場合、プログラミングの時間を大幅に節約できる提案です。このインポートを実行する頻度に応じて、数日間のプログラミング時間を節約することは、実行中に数時間待つことと引き換えに簡単に価値があります。

SSISを使用して読み取り&挿入しますが、WinFormsアプリからパッケージとして呼び出します。次に、ソース、宛先、接続文字列などをパラメーター/構成として渡すことができます。

HowTo: http://msdn.microsoft.com/en-us /library/aa337077.aspx

SSIS内で変換とエラー処理を設定し、入力パラメーターに基づいて論理分岐を作成することもできます。

ファイルの列フォーマットが、データが最終的に必要なターゲットテーブルと一致する場合、コマンドラインユーティリティ bcp を使用してデータファイルをロードすることを好みます。それは非常に高速であり、任意の" odd"のエラーファイルを指定できます。挿入に失敗したレコード。

コマンドラインパラメーター(サーバー、データベース、ユーザー名/パスワードまたは信頼関係接続、テーブル、エラーファイルなど)を保存する必要がある場合、アプリでコマンドを開始できます。

データベースサーバーからアクセス可能なシステム上にデータファイルを置く必要がないため、BULK INSERT SQLコマンドを実行するよりもこの方法の方が好きです。一括挿入を使用するには、ロードするデータファイルへのパスを指定する必要があるため、ロードを実行しているデータベースサーバー上のシステムユーザーが表示および読み取り可能なパスである必要があります。私にとってはあまりにも面倒です。 :-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top