2

毎日約 3000 個の新しい csv ファイルが入ってくるフォルダーがあり、それぞれに 50 ~ 2000 行の情報が含まれています。

現在、これらのファイルを一度に 1 つずつ取得し、各行を 1 つずつ取得してストアド プロシージャに送信し、コンテンツをデータベースに挿入するプロセスが用意されています。

これは、1 日の間に、次の 3000 ファイルが到着する前に 3000 ファイルを処理するのに苦労する可能性があることを意味します。

私はこのプロセスを改善しようとしており、次のアイデアがありました

  • C# 4.0 の新しい Parallel 機能を使用して、複数のファイルを一度に処理できるようにし、引き続き 1 行ずつストアド プロシージャに渡します。
  • ファイル内のすべての行を一度に挿入できる新しい一時データベース テーブルを作成し、一時テーブルに新しく追加された行に対してストアド プロシージャを呼び出します。
  • プロセスを 2 つのタスクに分割します。1 つのジョブはファイルから一時データベース テーブルにデータを読み取り、もう 1 つは一時テーブルの行を処理します。

これを行う方法について他のアイデアはありますか?現在、ファイルごとに最大 20 秒かかる場合があります。このパフォーマンスを大幅に改善したいと考えています。

4

4 に答える 4

3

SQL Server Bulk Insert はまさに必要なものかもしれません

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

これらすべての挿入に時間がかかる場合に発生する可能性のある別の問題は、行が追加されるたびに、テーブルのインデックスが再作成される可能性があることです。このような検索を行うと、現在の手順のパフォーマンスを向上させる方法について、多くの優れた記事が得られます http://www.google.com/search?q=sql+insert+performance

于 2011-04-03T20:55:02.957 に答える
1

インポートする3000個のファイルすべてにそれぞれ2000行があるとします。これは1日あたり600万行です。ボトルネックは、挿入を行うクライアントではなく、データベース自体にある可能性があります。問題のテーブルでインデックスが有効になっている場合、テーブルのインデックスの程度によっては、挿入が遅くなる可能性があります。何かが行われるのを待っているのはデータベースであり、その逆ではなく、遅れているのはインポートルーチンであると結論付けるに至った兆候は何ですか?

于 2011-04-03T22:52:32.727 に答える
1

SQL Server ネイティブの BCP ユーティリティを使用できます。

BCP ユーティリティの詳細については、「bcp ユーティリティを使用して一括データをインポートおよびエクスポートする」を参照してください。

こちらもご覧ください:一括インポートおよび一括エクスポート操作について

于 2011-04-03T21:00:15.073 に答える
0

あなたが言った

現在、これらのファイルを1つずつ取得し、各行を1つずつ 取得してストアドプロシージャに送信し、コンテンツをデータベースに挿入するプロセスがあります。

(強調が追加されました。)

これは、 1行が1トランザクションに等しいことを意味しているようです。

それを修正します。

  • ファイルを前処理して、一括読み込みに使用できるようにします。
  • ファイルを前処理して、有効なSQL INSERTステートメントを形成し、その方法でロードします。(単一のトランザクションで。)

どちらも「ストアドプロシージャを置き換える」ように聞こえると思います。しかし、本当のポイントはトランザクションの数を減らすことです。これらのオプションのいずれかにより、このプロセスのトランザクション数が1日あたり600万(最悪の場合)から1日あたり3000に減少します。

于 2011-04-04T01:11:02.880 に答える