2

ORACLE_LOADERアクセスドライバーによるOracle外部テーブルのパフォーマンスの向上について、次の2つのステートメントについて説明してください。

  1. 固定長レコードは、文字列で終了するレコードよりも高速に処理されます。
  2. 固定長フィールドは、区切りフィールドよりも高速に処理されます。

コードで説明すると、概念を深く理解するのに役立つ場合があります。2 つの構文を次に示します。

固定フィールド長

create table ext_table_fixed (
   field_1 char(4),
   field_2 char(30)
)
organization external (
   type       oracle_loader
   default directory ext_dir
   access parameters (
     records delimited by newline
     fields (
       field_1 position(1: 4) char( 4),
       field_2 position(5:30) char(30)
    )
  )
  location ('file')
)
reject limit unlimited;

カンマ区切り

create table ext_table_csv (
  i   Number,
  n   Varchar2(20),
  m   Varchar2(20)
)
organization external (
  type              oracle_loader
  default directory ext_dir
  access parameters (
    records delimited  by newline
    fields  terminated by ','
    missing field values are null
  )
  location ('file.csv')
)
reject limit unlimited;
4

2 に答える 2

4

単純化された、概念的な、データベース固有ではない説明:

可能な最大レコード長が事前にわかっている場合、レコードの終わり/次のレコードの始まりを一定の時間で見つけることができます。これは、その位置が単純な加算を使用して計算できるためであり、配列のインデックス付けに非常によく似ています。intレコードへのポインターとして s を使用していて、レコード サイズがどこかで定義された整数定数であると想像してください。次に、現在のレコードの場所から次のレコードの場所に移動するには:

int current_record = /* whatever */;
int next_record = current_record + FIXED_RECORD_SIZE;

それでおしまい!

あるいは、文字列で終了する (または別の方法で区切られた) レコードとフィールドを使用する場合、区切り文字が見つかるまですべての文字を調べなければならない線形時間スキャンによって、次のフィールド/レコードが見つかると想像できます。従来通り、

char DELIMITER = ','; // or whatever
int current_record = /* whatever */;
int next_record = current_record;
while(character_at_location(next_record) != DELIMITER) {
    next_record++;
}

これは現実世界の実装の単純化された、または素朴なバージョンかもしれませんが、一般的な考え方は変わりません: 同じ操作を一定時間で簡単に実行することはできず、一定時間であったとしても、単一の追加操作を実行します。

于 2013-01-26T15:33:07.807 に答える