5

合計約100GBの471個のファイルがあります。ファイルは「\t」で区切られており、トランザクション データは次の形式です。

char(10) not null,
char(8) not null,
char(1) not null,
char(4) not null,
number not null,
char(1) not null,
char(1) not null,
char(1) not null,
number not null

ファイル内のトランザクションの順序は重要であり、理想的には主キー ID を使用して保持する必要があります。最初に、これらのファイルを sqlldr でロードしましたが、非常に時間がかかります。最近、外部テーブルについて学びました。戦略的な観点から、どちらの方法が優れていますか? 外部テーブルはどのように機能しますか? ありがとうございました。

4

1 に答える 1

3

外部表とSQL*Loaderのレコード解析は非常に似ているため、通常、同じレコード形式ではパフォーマンスに大きな違いはありません。ただし、次の状況では、外部表の方が適切な場合があります。

  • データベースにロードされるときにデータを変換したいと考えています。
  • データをロードする必要があり、ステージング テーブルの追加のインデックス作成が必要です。
  • 最初に外部データを分割せずに、透過的な並列処理を使用したい。

ただし、次の状況では、最高のロード・パフォーマンスを得るためにSQL*Loaderを使用してください。

  • リモートでデータをロードしたい。
  • データを変換する必要はなく、データを並行してロードする必要もありません。

SQL*Loader のパフォーマンスを改善するために、次の提案が行われました。

  • ロード プロセス中にロード テーブルにインデックスや制約 (主キー) を設定しないでください。
  • コマンド ラインに次のオプションを追加します: DIRECT=TRUE。これにより、従来のパス ローダーの代わりにダイレクト パス ローダーを使用することで、RDBMS 処理の大部分がバイパスされます。ただし、直接ロードを使用できない場合もあります。これらの制限は、『Oracle Server Utilities Guide』から取得できます
  • 区切られたデータではなく、固定幅のデータを使用します。区切られたデータの場合、各レコードをスキャンして区切り記号を探す必要があります
  • 変換は時間と CPU を集中的に使用するため、文字セットの変換は避けてください。
  • 従来型パスの場合は、READSIZE および BINDSIZE パラメータを使用します。
    READSIZE は、読み取りシステム コールごとにより大きなデータ チャンクを取得します。BINDSIZE パラメータはバインド配列のサイズを指定し、バッチごとにロードされる行数を指定します。

ソース: http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

于 2012-01-02T02:47:19.947 に答える