pg_bulkload は PostgreSQL 向けの高速データロードユーティリティです。
pg_bulkload プロジェクトは NTT OSS センタから PostgreSQL のコミュニティへ貢献するものとして pgFoundry に登録されているプロジェクトの一つです。
pgFoundry のページはこちらです: http://pgfoundry.org/projects/pgbulkload
ここでダウンロード、
ドキュメントの入手、バグレポート、メーリングリストの閲覧・購読などが行えます。
詳細なドキュメントは こちらから入手可能です。 日本語ドキュメントは「ランゲージ」で"Japanese" を選択し、"Go"を押すと表示されます。
pg_bulkloadは一定の制約条件の下で大量のデータを高速にロードするためのプログラムです。
大量のデータを投入するような状況では、細かなチェックは省いてでもいいからとにかく
高速にデータをロードしたいという場面があります。たとえば、あるデータベースに格納
されている情報を別のデータベースへ移送するような状況や、これから投入しようとする
データの整合性がすでに別のツールで保証されているような状況がこれにあたります。
このような状況を想定して pg_bulkload は開発されました。
したがって、整合性を確認できていないデータのロードに対して、 pg_bulkload の使用
は適していません。この場合にはPostgreSQLがデータロードのためにもともと用意して
いる COPY コマンドの利用をお勧めします。
注意点、使用方法を十分に理解した上で、pg_bulkload をご利用ください。
pg_bulkloadを利用するユーザが直接扱うプログラムは以下の二つです。
pg_ctlコマンドのラッパコマンドで、PostgreSQLサーバを起動・停止するプログラムです。 postgresqlスクリプトの内部でpg_ctlコマンドを呼び出しています。 また、pg_bulkloadによるロード中にサーバがダウンした場合、pg_bulkloadコマンドを呼 び出して自動的に独自のリカバリを行う機能を持っています。 pg_bulkload利用環境下では、必ずこのpostgresqlスクリプトを使用してください。
下記の"注意点"を必ず読んでください。特に、
DIRECT モードで使うとき (WAL 書き込みをスキップします: デフォルトの設定です)
initdbを実行し、データベースクラスタが作られていること
$ cd [directory where postgresql-8.2or3.X.tar.gz is untared]/contrib/
$ tar zxvf pg_bulkload-2.3.X.tar.gz
$ cd pg_bulkload
$ make
$ make install
$ mkdir $PGDATA/pg_bulkload
$ postgresql start
$ psql -f $PGHOME/share/contrib/pg_bulkload.sql database_name
次の 3ステップにより、pg_bulkload でロードすることが可能です。
$PGDATA/pg_bulkload ディレクトリが存在することを確認してください。そのディレクトリにはロードステータスファイルが作成されます。
$ pg_bulkload sample_csv.ctl
次のオプションを指定可能です。pg_bulkload パッケージに含まれる sample_csv.ctl や sample_bin.ctl もあわせて参照してください。
LOAD=DIRECT, which is the default)、以下のことに注意しなければなりません:
pg_bulkload がクラッシュし、.loadstatus ファイルが $PGDATA/pg_bulkload に残っていた場合、
データベースは pg_bulkload 独自のリカバリ手順によってリカバリする必要があります。
これは "pg_bulkoad -r" コマンドを "pg_ctl start" より前に実行することにより行います。
PostgreSQL の起動・停止を postgresql スクリプトにより行うことで、このリカバリをし忘れることを防ぎます。
postgresql スクリプトは内部的に "pg_bulkload -r" を実行し、続けて "pg_ctl start" を行っています。
そのためダイレクトロードの利用環境下では、pg_ctl を直接使わずに、
postgresql スクリプトを利用することをお勧めいたします。
Windows オペレーティングシステム上で pg_bulkload を使う場合、postgresql スクリプトは pg_bulkload パッケージに同梱されていません。 そのため、リカバリ時には "pg_bulkload -r" を手動で実行する必要があります。
WAL を残さないために、PITR によるアーカイブログリカバリは利用できません。 もし PITRを利用する場合には、ロード終了後に対象のデータベースのバックアップを取ってください。
$PGDATA/pg_bulkload ディレクトリ中のロードステータスファイル (*.loadstatus) は絶対に削除してはいけません。
pg_bulkload のリカバリのために必ず必要になるからです。
kill -9は使わない
pg_bulkload を "kill -9" を使って停止させるのはできる限りやめてください。
もし実行すると postgresql スクリプトによるリカバリが実行されます。
pg_bulkload に加えて、次のユーザ定義関数がタイムスタンプ文字列のパースのオーバヘッドをスキップするために提供されています。 これも pg_bulkload のパッケージに含まれています。
2007-01-01 12:34:56
インストール手順は以下の通りです。インストール先のディレクトリへのアクセス権限は正しく与えられているものとします。
$ cd [directory where postgresql-8.2or3.X.tar.gz is untared]/contrib/
$ tar zxvf pg_bulkload-2.3.X.tar.gz
$ cd pg_bulkload
$ make
$ make install
$ postgresql start
$ psql -f $PGHOME/share/contrib/pg_timestamp.sql database_name
タイムゾーンを含む入力文字列は高速化の対象外です。 また、上記のフォーマットに合致しないものはPostgreSQLの書式変換ルーチンを通します。 この場合の処理速度は従来のものと同じか、もしくは遅くなります。
pg_timestamp_in は timestamp 型データを高速に読む機能を提供するものの、
通常使われる PostgreSQL の内部関数を置き換えます。
pg_timestampを登録すると、pg_bulkloadに限らず、timestamp型を利用する全ての処理
はこの関数を使うことになります。すなわち、COPYやINSERTでもこの関数を利用します。
この影響を避けるためには、pg_timestamp_in をロードの時だけ利用し、
通常時はアンインストールするなどの対応が必要です。
NTT OSS センタ
Copyright(C) 2007-2008 日本電信電話株式会社
| 項目 | 8.1.8 | 8.2.3 |
| COPY(秒) | 1601.4 | 1586.2 |
| pg_bulkload(秒) | 147.7 | 131.8 |
| 比 | 10.8 | 12.0 |
| 項目 | 8.1.8 | 8.2.3 |
| COPY(秒) | 548.9 | 596.5 |
| pg_bulkload(秒) | 147.7 | 131.8 |
| 比 | 4.17 | 4.04 |
| 項目 | 8.1.8 | 8.2.3 |
| pg_bulkload(インデックス定義済みテーブル) | 147.7 | 131.8 |
| pg_bulkload (インデックスなしテーブル) | 72.5 | 72.9 |
| COPY (インデックス定義済みテーブル) | 1601.4 | 1586.2 |
| COPY (インデックスなしテーブル) | 127.7 | 140.2 |
| CREATE INDEX | 468.8 | 408.7 |
| 項目 | 値 |
| マシン | PowerEdge1900 |
| CPU | Dual Core Intel(R) Xeon(R) Processor5050 CPU3.0GHz |
| メモリ | 2GB (512MB*4) |
| ディスクサイズ (OSがインストールされているディスク) | SerialATAⅡ80GB |
| ストレージサイズ (データベースクラスタが格納されているディスク) | RAID0 1.2TB |
| RAID コントローラキャッシュ | 128MB |
| ハイパースレッド | ON |
| OSバージョン | RHEL ES release4 update4(32bit) |
| カーネルバージョン | 2.6.9-42.ELsmp |
| libcバージョン | 2.3.4 |
| PostgreSQLバージョン | 8.1.8/8.2.3 |
| shared_buffers | 1024 |
| checkpoint_segments | 1000 |
| checkpoint_timeout | 3600 |
| work_mem | 1024 |
| maintenance_work_mem | 16384 |
| テーブル定義 | DBT-2 customer table |
| インデックスカラム | c_id (PRIMARY KEY) |
| c_d_id (非ユニーク B-Tree) | |
| 制約 | 非NULL (全カラム) |
| 既存のデータ量 | 16,777,216 tuples(4GB) |
| 新規ロードデータ量 | 4,194,304 tuples(1GB) |
| 入力ファイルタイプ | CSV |
| pg_bulkload バージョン | pg_bulkload-2.1.2(PG-8.1.8)/2.2.0(PG-8.2.3) |