4

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

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

ありがとうございます。誰かが必要な場合は、明確にするために質問を編集します。

4

9 に答える 9

16

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

また、 SQL Server 2005 での Flat File Bulk Import メソッドの速度比較もチェックする価値があります。

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

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

于 2008-09-26T19:56:14.940 に答える
1

完全復旧から一括ログに切り替えることを検討してください。これにより、バックアップを適切なサイズに保つことができます。

于 2008-09-26T20:20:26.177 に答える
1

SSIS を強くお勧めします。何百万ものレコードを読み取り、途中で比較的短時間でクリーンアップできます。

SSIS を理解するには、ある程度の時間を割く必要がありますが、それは報われるはずです。SO には他にも役立つスレッドがいくつかあります。

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

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

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

于 2008-09-26T22:14:12.910 に答える
1

これはストリーミングの取り組みになります。

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

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

最初は、数百行の一括挿入を試して、ストリーミングが適切に機能していることを確認してから、必要なものをすべて開くことができます。

于 2008-09-26T19:54:43.867 に答える
1

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

于 2008-09-26T20:00:01.373 に答える
1

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

于 2008-09-26T20:03:26.250 に答える
0

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

ハウツー: http: //msdn.microsoft.com/en-us/library/aa337077.aspx

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

于 2008-09-26T20:12:48.333 に答える
0

ファイルの列形式が、最終的にデータを格納する必要があるターゲット テーブルと一致する場合は、コマンド ライン ユーティリティbcpを使用してデータ ファイルをロードすることをお勧めします。これは非常に高速で、挿入に失敗した「奇数」レコードのエラー ファイルを指定できます。

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

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

于 2008-09-26T20:01:06.550 に答える
0

あなたが話しているデータのサイズは、実際にはそれほど巨大ではありません。あなたの効率の懸念が何であるかはわかりませんが、それが挿入されるまで数時間待つことができれば、各行を一度に 1 つずつ挿入するだけの非常に単純な手法でこれを達成するのがいかに簡単であるかに驚くかもしれません。 . 一度に 1000 ほどの行をまとめて SQL サーバーに送信すると、かなり高速になる場合もあります。

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

于 2008-09-26T20:05:12.783 に答える