English


pg_bulkload ホームページへようこそ

pg_bulkload は PostgreSQL 向けの高速データロードユーティリティです。 pgFoundry のページより、ダウンロードドキュメントの入手、バグレポート、メーリングリストの閲覧・購読などが行えます。

Here is an English page.


ドキュメント


性能測定結果

COPY と pg_bulkload の比較のため、以下の条件で測定を行いました。 PostgreSQL サーバは、基本的なチューニングを済ませた状態です。

テーブル定義
TPC-C ベンチマークの簡易実装である DBT-2 の、customer テーブルと同じ構成です。
インデックス定義
2つのインデックスを定義しています。 1つ目は、integer 1列を含む昇順の主キーです。 2つ目は、integer 1列を含むランダム・キーから成る非ユニークインデックスです。

測定パターンは以下です。

  1. 空のテーブルへの 4GB のデータの初期ロード
  2. 既に 4GB のデータを持つテーブルへの、1GB の追加ロード
  3. PARALLEL, FILTER 機能の性能への影響

結果1 : 初期ロード

COPY で初期ロードを行う場合、COPY と同一のトランザクションで TRUNCATE を行うと高速にロードできます。 また、COPY ではインデックスを張らない状態でロードし、ロード後からインデックスを作成したほうが全体の時間が短くなります。 これらのチューニングを行った COPY と比べても、pg_bulkload はロード時間を約85%まで短縮できています。

初期ロード: TRUNCATE+COPY vs pg_bulkload
項目 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 %

結果2 : 追加ロード

追加ロードの COPY では、既存のデータは削除できないため、初期ロードで行った TRUNCATE によるチューニングは使えません。 また、インデックスの再作成の際は、既存のデータもインデックスしなければならないため、必ずしも高速化には結びつかないようです。 その結果、pg_bulkload のロード時間は約35%となり、COPY との差が広がっています。

追加ロード: COPY vs pg_bulkload
項目 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 %

結果3 : PARALLEL, FILTER 機能の性能への影響

パラレルローダは WRITER = PARALLEL の指定で利用できます。 入力ファイルの読み込みと、テーブルへの行の書き出しを別プロセスで行うため、特にマルチCPU環境で高速化が期待できます。 実測では、ロード時間を約70%に短縮できました。

FILTER 機能は、入力データを柔軟に編集した後にロードすることができますが、編集するためのコストは無料ではありません。 実測では、SQL関数を利用する場合には 250-300%、C言語関数を利用する場合には 150% までロード時間が増加しました。

PARALLEL, FILTER 機能の性能への影響
項目 初期ロード (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 を使用。インデックス付き。

測定条件

項目
ServerDell PowerEdge 1900
CPUDual Core Xeon 5050 (3.0GHz)
Hyper-Threadingoff
Memory2GB
Storage SubsystemDell PowerVault 221S
DisksSCSI 7x146GB (RAID 0)
RAID ControllerPERC 4e/DC DRAM=128MB
OSCentOS 5.5 (64bit)
shared_buffers256MB
checkpoint_segments300
checkpoint_timeout5min
Table definitionDBT-2 customer table
Indexed columnsc_id (PRIMARY KEY)
c_d_id (non-unique B-Tree)
ConstraintsNOT NULL for all columns
Input file formatCSV