7.9 従来型パス・ロード、ダイレクト・パス・ロードおよび外部表ロード

SQL*Loaderでデータをロードするには、いくつかの方法があります。

7.9.1 従来型パス・ロード

従来型パス・ロードでは、入力レコードがフィールド指定を基に解析され、各データ・フィールドが対応するバインド配列(SQL*Loaderがロードするデータを格納するメモリー内の領域)にコピーされます。

バインド配列が一杯の場合(または読み取るデータが残っていない場合)、配列挿入操作が実行されます。

SQL*Loaderでは、バインドの配列に挿入後、LOBフィールドが格納されます。そのため、LOBフィールドの処理にエラーが発生した場合(たとえば、LOBFILEがないなど)、LOBフィールドは空のままになります。配列の挿入の実行後にLOBデータがロードされるため、BEFOREおよびAFTER行トリガーはLOB列に対して機能しない場合もあります。これは、SQL*Loaderで列にLOBの内容をロードする機会を持つ前にトリガーが起動されるためです。たとえば、LOB列C1にデータをロードして、BEFORE行トリガーを使用してそのLOB列の内容を調べ、その結果を基に、他の列C2にロードされる値を導出するとします。これは、トリガーの起動時にLOBの内容がロードされていないため不可能です。

7.9.2 ダイレクト・パス・ロード

ダイレクト・パス・ロードでは、入力レコードがフィールド指定を基に解析され、入力フィールド・データが列のデータ型に変換されて列配列が作成されます。

この列配列は、Oracle Databaseブロック形式でデータ・ブロックを作成するブロック・フォーマッタに渡されます。新しくフォーマットされたデータベース・ブロックはデータベースに直接書き込まれるため、通常行われるデータ処理の大部分が省略されます。ダイレクト・パス・ロードによる処理は、従来型パス・ロードと比較すると非常に高速ですが、制限事項がいくつかあります。

7.9.3 パラレル・ダイレクト・パス

パラレル・ダイレクト・パス・ロードでは、複数のダイレクト・パス・ロード・セッションで 同じデータ・セグメントを同時にロードできます(セグメント内の並列化が可能です)。

パラレル・ダイレクト・パスには、ダイレクト・パスより多くの制約事項があります。

7.9.4 外部表ロード

外部表はデータベース内に存在しない表として定義されている表で、アクセス・ドライバが用意されている任意の形式が可能です。

Oracle Databaseでは、ORACLE_LOADER,およびORACLE_DATAPUMPの2つのアクセス・ドライバが提供されています。外部表を記述するメタデータを提供することで、外部表内のデータをあたかも標準的なデータベース表内に存在しているデータのように公開できます。

外部表ロードでは、外部データ・ファイルに含まれているデータの外部表が作成されます。ロード処理では、INSERT文が実行され、データ・ファイルからデータがターゲット表に挿入されます。

従来型パス・ロードおよびダイレクト・パス・ロードではなく、外部表ロードを使用した場合のメリットは、次のとおりです。

  • データ・ファイルが大きい場合、外部表のロードではパラレルでファイルのロードを試みます。

  • 外部表ロードでは、外部表の作成に使用されるINSERT文の一部としてSQL関数およびPL/SQLファンクションを使用することによってロードされるデータを変更できます。

ノート:

Windowsオペレーティング・システムでの名前付きパイプを使用した外部表ロードは、サポートされません。

7.9.5 外部表およびSQL*Loaderの選択

データのロード時にロード・パフォーマンスが最も高い方法を学習します。

外部表とSQL*Loaderのレコード解析は類似しているため、通常、同じレコード形式での大幅なパフォーマンスの違いはありません。ただし、外部表とSQL*Loaderのアーキテクチャは異なるため、一方の方法が他方より適している場合があります。

次の状況では、最適なロード・パフォーマンスを得るために外部表を使用します。

  • データベースへのロード時にデータを変換する場合
  • 透過的にパラレル処理を行う前に、外部データを分割する必要がない場合

次の状況では、最適なロード・パフォーマンスを得るためにSQL*Loaderを使用します。

  • リモートでデータをロードする場合
  • データに対して変換を行う必要がなく、そのデータをパラレルでロードする必要がない場合
  • データをロードする必要があり、ステージング表に索引を追加する必要がある場合

7.9.6 SQL*Loaderと外部表との処理内容の違い

外部表を使用したデータのロード(ORACLE_LOADERアクセス・ドライバを使用)と、SQL*Loaderの従来型パス・ロードおよびダイレクト・パス・ロードを使用したデータのロードとの違いを確認することをお薦めします。

この項で示す情報は、ORACLE_DATAPUMPアクセス・ドライバには当てはまりません。

7.9.6.1 複数のプライマリ入力データ・ファイル

SQL*Loaderのロードを使用したプライマリ入力データ・ファイルが複数存在する場合は、入力データ・ファイルごとに不良ファイルおよび廃棄ファイルが作成されます。

外部表ロードでは、すべての入力データ・ファイルに対する不良ファイルおよび廃棄ファイルは、1つずつのみです。外部表ロードでパラレル・アクセス・ドライバが使用される場合は、各アクセス・ドライバに不良ファイルおよび廃棄ファイルが含まれます。

7.9.6.2 構文およびデータ型

外部表のロードでは、SQL*Loaderを使用してサポートされていない構文とデータ型をロードできません。

データ移行計画の一部として、サポートされていない構文またはデータ型でSQL*Loaderを使用しないでください。移行前に問題を解決します。次の構文またはデータ型は使用できません:

  • CONTINUEIFまたはCONCATENATEを使用した、1つの論理レコードへの複数の物理レコードの結合

  • SQL*Loaderデータ型(GRAPHICGRAPHIC EXTERNALおよびVARGRAPHIC)のロード

  • データベースの列型(LONG、ネストした表、VARRAYREF、主キーREFおよびSID)の使用

ノート:

LONGデータ型(LONGLONG RAWLONG VARCHARLONG VARRAW)のすべての形式は、Oracle8iリリース8.1.6で非推奨になりました。以降のリリースでは、LONGデータ型は既存のアプリケーションとの下位互換性のために提供されていました。以降のリリースで開発された新しいアプリケーションでは、大量の文字データにCLOBおよびNCLOBデータ型を使用することをお薦めします。

7.9.6.3 バイト順序マーク

SQL*Loaderでは、バイト順序マークが書き込まれるかどうかは、文字セットまたは表ロードによって決まります。

プライマリ・データ・ファイルにUnicode文字セット(UTF8またはUTF16)が使用され、バイト順序マーク(BOM)が含まれている場合、バイト順序マークは対応する不良ファイルおよび廃棄ファイルの先頭に書き込まれます。

外部表ロードでは、バイト順序マークは不良ファイルおよび廃棄ファイルの先頭に書き込まれません。

7.9.6.4 デフォルトの文字セット、日付マスク、小数点区切り

NLS文字セットの表示は、SQL*Loaderと外部表の各種設定で制御します。

SQL*Loaderでは、デフォルトの文字セット、日付マスクおよび小数点区切りが、クライアント側でのNLS環境変数の設定によって決まります。

外部表のフィールドでは、NLSパラメータのデータベース設定によって、デフォルトの文字セット、日付マスクおよび小数点区切りが決定されます。

7.9.6.5 バックスラッシュ・エスケープ文字の使用

SQL*Loaderと外部表では、一重引用符を囲み文字として識別するために様々な表記規則が使用されます。

SQL*Loaderでは、一重引用符が囲み文字として識別されるようにするために、バックスラッシュ(\)エスケープ文字を使用できます。次に例を示します

FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\''

外部表では、文字列内でバックスラッシュ・エスケープ文字を使用すると、エラーが発生します。解決策として、二重引用符を使用することで、一重引用符を囲み文字として使用できます。次に例を示します:

TERMINATED BY ',' ENCLOSED BY "'"

7.9.7 オブジェクト・ストレージに格納されたデータを使用した表のロード

SQL*Loaderを使用して、オブジェクト・ストレージから標準のOracle Database表にデータをロードする方法について学習します。

Oracle Database 21c以降では、SQL*LoaderパラメータCREDENTIALを使用して、オブジェクト・ストアへの読取りアクセスを有効にする資格証明を提供できます。オブジェクト・ストアからのパラレル・ロードがサポートされています。

データ・ファイルの場合、オブジェクト・ストアで読み取るデータ・ファイルのURIを指定できます。CREDENTIAL値は、SQL*Loaderを実行しているユーザーに付与される資格証明を指定します。これらの権限により、SQL*Loaderはオブジェクトにアクセスできます。

ノート:

ローカル・ファイルとオブジェクト・ストア・ファイルの混合はサポートされていません。

次の例では、データをロードする表(T)があります。

SQL> create table t (x int, y int);

この表にロードするfile1.txtという名前のデータ・ファイルがあります。内容は次のとおりです。

X,Y
1,2
4,5

この表をオブジェクト・ストアにロードするには、次の手順を実行します。

  1. オブジェクト・ストアの入出力(I/O)を有効にするために必要なライブラリをインストールします。

    % cd $ORACLE_HOME/rdbms/lib
    % make -f ins_rdbms.mk opc_on
    
  2. ファイルfile1.txtをオブジェクト・ストレージのバケットにアップロードします。

    オブジェクト・ストレージにファイルをアップロードする最も簡単な方法は、Oracle Cloudコンソールからファイルをアップロードすることです。

    1. Oracle Cloudコンソールを開きます。
    2. オブジェクト・ストレージのタイルを選択します。
    3. まだ作成していない場合は、バケットを作成します。
    4. アップロードをクリックし、ファイルfile1.txtを選択してバケットにアップロードします。
  3. Oracle Databaseで、ウォレットおよび資格証明を作成します。

    次に例を示します:

    $ orapki wallet create -wallet /home/oracle/wallets  -pwd mypassword-auto_login
    $ mkstore -wrl /home/oracle/wallets -createEntry oracle.sqlldr.credential.myfedcredential.username oracleidentitycloudservice/myuseracct@example.com
    $ mkstore -wrl /home/oracle/wallets -createEntry oracle.sqlldr.credential.myfedcredential.password "MhAVCDfW+-ReskK4:Ho-zH"  
    

    この例では、フェデレーテッド・ユーザー・アカウント(myfedcredential)の使用方法を示します。Oracle Cloud Infrastructureドキュメントで説明されているように、パスワードは自動的に生成されます。(「資格証明の管理」の認証トークンの作成に関する項を参照)。

    ノート:

    mkstoreウォレット管理コマンドライン・ツールは、Oracle AI Database 26aiでは非推奨であり、将来のリリースで削除される可能性があります。

    ウォレットの管理には、orapkiコマンドライン・ツールの使用をお薦めします。

  4. ウォレットを作成した後、$ORACLE_HOME/network/adminディレクトリのsqlnet.oraファイルに場所を追加します。

    次に例を示します:

    vi test.ctl
    LOAD DATA
    INFILE  'https://objectstorage.eu-frankfurt-1.oraclecloud.com/n/dbcloudoci/b/myobjectstore/o/file1.txt'
    truncate
    INTO TABLE T
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    (X,Y)
    
  5. SQL*Loaderを実行して、データをオブジェクト・ストアにロードします。

    次に例を示します:

    sqlldr test/mypassword@pdb1 /home/oracle/test.ctl
    credential=myfedcredentiallog=test.log  external_table=not_used