 
pg_bulkload は PostgreSQL 向けの高速データロードユーティリティです。 pgFoundry のページより、ダウンロード、 ドキュメントの入手、バグレポート、メーリングリストの閲覧・購読などが行えます。
COPY と pg_bulkload の比較のため、以下の条件で測定を行いました。 PostgreSQL サーバは、基本的なチューニングを済ませた状態です。
測定パターンは以下です。
COPY で初期ロードを行う場合、COPY と同一のトランザクションで TRUNCATE を行うと高速にロードできます。 また、COPY ではインデックスを張らない状態でロードし、ロード後からインデックスを作成したほうが全体の時間が短くなります。 これらのチューニングを行った COPY と比べても、pg_bulkload はロード時間を約85%まで短縮できています。
| 項目 | version (postgres + bulkload) | |
|---|---|---|
| 8.4.4 + 2.4 | 9.0b2 + 3.0 | |
| COPY with indexes | 1133.4 sec | 1105.8 sec | 
| COPY without indexes + CREATE INDEX | 717.9 sec | 705.3 sec | 
| pg_bulkload (DIRECT) with indexes | 603.2 sec | 598.9 sec | 
| 時間比 | 84.0 % | 84.9 % | 
 
追加ロードの COPY では、既存のデータは削除できないため、初期ロードで行った TRUNCATE によるチューニングは使えません。 また、インデックスの再作成の際は、既存のデータもインデックスしなければならないため、必ずしも高速化には結びつかないようです。 その結果、pg_bulkload のロード時間は約35%となり、COPY との差が広がっています。
| 項目 | version (postgres + bulkload) | |
|---|---|---|
| 8.4.4 + 2.4 | 9.0b2 + 3.0 | |
| COPY with indexes | 520.4 sec | 549.3 sec | 
| COPY without indexes + CREATE INDEX | 805.3 sec | 799.6 sec | 
| pg_bulkload (DIRECT) with indexes | 185.2 sec | 191.7 sec | 
| 時間比 | 35.6 % | 34.9 % | 
 
パラレルローダは WRITER = PARALLEL の指定で利用できます。 入力ファイルの読み込みと、テーブルへの行の書き出しを別プロセスで行うため、特にマルチCPU環境で高速化が期待できます。 実測では、ロード時間を約70%に短縮できました。
FILTER 機能は、入力データを柔軟に編集した後にロードすることができますが、編集するためのコストは無料ではありません。 実測では、SQL関数を利用する場合には 250-300%、C言語関数を利用する場合には 150% までロード時間が増加しました。
| 項目 | 初期ロード (4GB) | 追加ロード (1GB) | 
|---|---|---|
| pg_bulkload (DIRECT) | 598.9 sec | 191.7 sec | 
| pg_bulkload (PARALLEL) | 413.5 sec | 133.0 sec | 
| 時間比 | 69.0 % | 69.4 % | 
| pg_bulkload (SQL-FILTER) | 1813.9 sec | 484.6 sec | 
| 時間比 | 302.9 % | 252.7 % | 
| pg_bulkload (C-FILTER) | 918.4 sec | 263.7 sec | 
| 時間比 | 153.3 % | 137.6 % | 
 
すべて PostgreSQL 9.0b2 + pg_bulkload 3.0b1 を使用。インデックス付き。
| 項目 | 値 | 
|---|---|
| Server | Dell PowerEdge 1900 | 
| CPU | Dual Core Xeon 5050 (3.0GHz) | 
| Hyper-Threading | off | 
| Memory | 2GB | 
| Storage Subsystem | Dell PowerVault 221S | 
| Disks | SCSI 7x146GB (RAID 0) | 
| RAID Controller | PERC 4e/DC DRAM=128MB | 
| OS | CentOS 5.5 (64bit) | 
| shared_buffers | 256MB | 
| checkpoint_segments | 300 | 
| checkpoint_timeout | 5min | 
| Table definition | DBT-2 customer table | 
| Indexed columns | c_id (PRIMARY KEY) | 
| c_d_id (non-unique B-Tree) | |
| Constraints | NOT NULL for all columns | 
| Input file format | CSV |