0

私の基本的なタスクは、データの一部を1つのファイルから複数の異なるテーブルにできるだけ速くインポートすることです。

LOAD DATA現在、テーブルごとにファイルがあり、構文を使用して各ファイルを関連するテーブルにインポートすることができます。

私たちの製品はクライアントから新しい要件を受け取りました。彼は複数のファイルを送信することに関心がなく、代わりに、複数のそのようなファイルを維持するのではなく、すべての元のレコードを含む単一のファイルを送信したいと考えています。

私はいくつかの提案を考えました:

  1. ロード先のテーブルとインポートする必要のある前の行の数を記述したファイル内の行の各バッチの前に、クライアントに1つのrawを書き込むように要求する場合があります。例えば

    Table2,500 
    ...
    Table3,400 
    

    LOAD DATA次に、テーブルと行番号の説明を破棄して、そのような行のブロックごとに適用を試みることができます。それは実行可能ですか?

  2. 各レコードに追加の属性としてテーブル名を含める必要がある場合があります。その後、各レコードを繰り返して挿入する必要がありますが、これよりもはるかに遅いと確信していますLOAD DATA

  3. たとえばJavaを使用してこのファイルを前処理LOAD DATAし、forループでasステートメントを実行することもできます。

私が望むほとんどすべてのフォーマット変更が必要かもしれませんが、それは単一のファイルでなければならず、インポートは高速でなければなりません。(テーブルの説明とは、実際には機能の別の名前であり、この機能に関連するすべてのファイルを別のテーブル名で保存することを決定しました。これはクライアントに対して透過的です)

最善の解決策として何が聞こえますか?彼らの他の提案はありますか?

4

2 に答える 2

1

単一のテーブルを定義し、すべてのデータをそのテーブルにロードしてから、select-insert-deleteを使用してこのテーブルからターゲットテーブルにデータを転送するという別のオプションがある場合があります。列の総数に応じて、これが可能な場合とできない場合があります。ただし、可能であれば、外部のJavaプログラムを作成する必要はなく、データのロードをデータベースに完全に依存することができます。これにより、よりクリーンで最適化された方法で作業を行うこともできます。ターゲットテーブルの名前にすることができる追加のマーカー列が必要になる可能性があります。その場合、これは上記のオプション2の変形と見なすことができます。

于 2012-09-23T15:11:16.360 に答える
1

それはあなたのデータファイルに依存します。私たちは似たようなことをしていて、データファイルを1行ずつ読み取るための小さなperlスクリプトを作成しました。行に必要なコンテンツが含まれている場合(たとえば、table1で始まる場合)、テーブル1にある必要があることがわかっているので、その行を印刷します。

次に、その出力をファイルまたは名前付きパイプに保存し、それをLOADDATAで使用できます。

これはおそらく、一時テーブルにロードし、そこから新しいテーブルにロードするよりもはるかに優れたパフォーマンスを発揮します。

perlスクリプト(ただし、どの言語でも実行できます)は非常に単純です。

于 2012-09-27T18:31:10.337 に答える