[Oracle][Oracle Database10g]
- SQL*Loaderを使用して、外部ファイルのデータをOracleデータベースの表にロードできる
- 一般的なSQL*Loaderセッションでは、SQL*Loaderの動作を制御する制御ファイルと1つ以上のデータ・ファイルが入力用に使用される
- SQL*Loaderの出力先は、データがロードされるOracleデータベース、ログ・ファイル、不良ファイルで、廃棄ファイルに出力される場合もある
SQL*Loaderのパラメータ
- SQL*Loaderは、sqlldrコマンドを指定すると起動します。また、オプションで、セッション特性を確立するパラメータを指定した場合も起動します。
- 常に、値がほとんど変らない同じパラメータを使用する場合は、コマンドラインではなく、次の方法でパラメータを指定すると効率的
- パラメータ・ファイルとしてグループ化。その後、PARFILEパラメータを使用して、そのパラメータ・ファイルの名前をコマンドラインで指定。
- 一部のパラメータは、OPTIONS句を使用して、制御ファイル内に指定。
以下の2つの方法
方法 |
内容 |
従来型パス・ロード |
データベースの表に対して(1つ以上の)SQL INSERT文が実行されます |
ダイレクト・パス・ロード |
データ・ブロックをフォーマットし、データ・ブロックを直接データ・ファイルに書き込むため、オーバーヘッドが大幅に削減 |
- 従来型パス・ロード(デフォルト)では、SQL INSERT文とバインド配列バッファを使用して、データをデータベース表にロード
- バッファ・リソースに関して他のすべてのプロセスと同等の処理が行われるため、競合が発生
- SQL文が生成され、 Oracleに渡されてから実行されるため、オーバーヘッドが発生
- 挿入が発生すると、常に、Oracleデータベースで空き領域のあるブロック(ディスク内に散在して、部分的に書込み可能なブロック)が検索され、そこにデータが書き込まれる
- 大量データのロード速度を大幅に低下させることがあります。
- バインド配列バッファに書き込むかわりに、SQL INSERT文を使用して、バインド配列をOracleデータベースに渡す。
- ダイレクト・パス・ロードは、ダイレクト・パスAPIを使用して、ロードされるデータをサーバーのロード・エンジンに渡す。
- ロード・エンジンは、渡されたデータから列配列構造体を作成
- ロード・エンジンは、列配列構造体を使用してOracleデータ・ブロックをフォーマットし、索引キーを作成します。新しくフォーマットされたデータベース・ブロックを直接データベースに書き込む
- I/Oを伴う処理がオーバーラップするため、ロード・パフォーマンスが向上。
- ダイレクト・パス・ロードの指定
- SQL*Loaderをダイレクト・パス・ロード・モードで起動するには、次の形式で、コマンドラインまたはパラメータ・ファイル(使用している場合)のDIRECTパラメータにtrueを設定します。
DIRECT=true
SQL*Loader制御ファイル
- 制御ファイルは、SQL*Loaderが解釈できる言語で記述されたテキスト・ファイル
セクション |
内容 |
第1セクション |
セッション全体の情報 |
第2セクション |
1つ以上のINTO TABLEブロックで構成、それぞれのブロックには、表名、その表の列などの、データがロードされる表についての情報 |
第3セクション |
オプションで、このセクションがある場合は、入力データを記述 |
- コメントはファイル中のコマンド部分のどこにでも記述できますが、データの部分には記述できません。
-- This is a comment.
- ロードするデータを含むデータ・ファイルを指定するには、INFILEキーワードにファイル名を続け、必要な場合はファイル処理オプション文字列を続ける
- ァイル名が指定されない場合は、デフォルトで制御ファイル名の拡張子を.datにしたものが採用
- ードするデータを制御ファイル内にも記述した場合は、ファイル名にアスタリスク(*)を指定
- 制御ファイルにデータがある場合
INFILE *
- デフォルトの拡張子.datを持つファイル sampleにデータがある場合
INFILE sample
- フルパスに指定されたファイルdatafile.datにデータがある場合
INFILE 'c:/topdir/subdir/datafile.dat'
- 位置指定
- POSITIONに、データ・フィールドの位置を指定します
( { start | * [+integer] } [{ : | - } end] )
パラメータ |
内容 |
start |
開始位置です。論理レコードの先頭バイト位置は1 |
end |
終了位置。start-endと表記することも、start:endと表記することもできます。 |
* |
対象となるデータ・フィールドが前のフィールドの直後にあることを示す |
integer |
オフセットを使用。前フィールドの終了位置直後の位置から現行のフィールドをオフセット |
- データ型の指定
- TERMINATED FIELD
- フィールドの開始位置から最初のデリミタ文字までのデータが読み込まれます
- TERMINATED BY WHITESPACEを指定すると、最初に空白文字(スペース、タブ、空白、LF、改ページまたは改行)が現れるまでデータが読み込まれます
TERMINATED [BY] { WHITESPACE | X'hexstr' | 'string' | EOF }
- ENCLOSEDフィールド
- 空白以外の文字が検出されるまで、空白文字はスキップされます
ENCLOSED [BY] [ 'string' | X'hexstr' ] [AND] [ 'string' | X'hexstr' ]
TERMINATED BY ',' a data string,
ENCLOSED BY '"' "a data string"
TERMINATED BY ',' ENCLOSED BY '"' "a data string",
ENCLOSED BY '(' AND ')' (a data string)
- 制御ファイルに指定された1つ以上のファイルなどから、SQL*Loaderにデータが読み込まれます
- レコード形式は、INFILEパラメータを使用して制御ファイルに指定することができる。デフォルトはストリーム・レコード形式
- データファイル形式
- 固定レコード形式
- 可変レコード形式
- ストリーム・レコード形式
INFILE datafile_name "fix n"
INFILE "datafile_name" "var n"
INFILE datafile_name ["str terminator_string"]
SQL*Loaderの事例
- 通常、各事例は次の種類のファイルで構成
- 制御ファイル(ulcase5.ctlなど)
- データ・ファイル(ulcase5.datなど)
- セットアップ・ファイル(ulcase5.sqlなど)
SQL> show user
ユーザーは"EXAM"です。
SQL> create table apache_access_log (
2 ip_address char(20) ,
3 user_inf char(20) ,
4 user_id char(20) ,
5 req_date char(60) ,
6 request varchar2(512),
7 status_cd char(10) ,
8 res_size char(10) ,
9 referer varchar2(512),
10 user_agent varchar2(512)
11 )
12 /
表が作成されました。
-- appache access logfile load sample control file
load data -- 新しくデータロードが開始される
infile 'access_log' -- ロードするデータが入っているファイル名
badfile 'access_log.bad' -- 拒否レコードが書き込まれるファイル名
discardfile 'access_log.dsc' -- 廃棄レコードが書き込まれるファイル名
insert -- すでにデータが存在する場合のオプション APPEND,REPLACE,TRUNCATE
into table exam.apache_access_log --
( ip_address position(*) char terminated by whitespace
, user_inf position(*) char terminated by whitespace
, user_id position(*) char terminated by whitespace
, req_date position(*) char enclosed by '[' and ']'
, request position(*) char enclosed by '"' and '"'
, status_cd position(*) char terminated by whitespace
, res_size position(*) char terminated by whitespace
, referer position(*) char enclosed by '"' and '"'
, user_agent position(*) char enclosed by '"' and '"'
)
- apache のアクセスログを、access_log.datに変更して、以下を実行
$sqlldr exam/abc123 apache_access_log.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on Sat Jul 11 22:05:04 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Commit point reached - logical record count 64
Commit point reached - logical record count 128
:
$ sqlldr exam/abc123 apache_access_log.ctl direct=true
SQL*Loader: Release 10.2.0.1.0 - Production on Sun Jul 12 00:18:28 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Load completed - logical record count 5872.
select * from exam.apache_access_log;
- ユーザーエージェントを調べてみる
select user_agent,count(user_agent) from exam.apache_access_log
group by user_agent
order by 2 desc
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.