pg_bulkload は PostgreSQL 向けの高速データロードユーティリティです。
COPY と pg_bulkload の比較のため、以下の条件で測定を行いました。 PostgreSQL サーバは、基本的なチューニングを済ませた状態です。 詳細な環境条件については末尾に記載しています。
測定パターンは以下です。
pg_bulkload の PARALLEL モードを用いることで、COPY に比べて半分程度の時間でロードを行うことができています。 COPY を用いる場合でも、インデックス定義なしで COPY することで処理時間を 2/3 程度にまで短縮することが可能です。 これは pg_bulkload の DIRECT モードとほぼ同等の効果があります。
項目 | 時間 | 時間比 |
---|---|---|
COPY with indexes | 500 sec | - |
COPY without indexes + CREATE INDEX |
333 sec (229 sec + 51 sec+ 53 sec) |
66.7 % |
pg_bulkload (DIRECT) with indexes |
334 sec | 66.8 % |
pg_bulkload (PARALLEL) with indexes |
221 sec | 44.2 % |
pg_bulkload を用いることで、インデックスを付けたままのロードでも、COPY と比較して DIRECT モードで 2/3 程度、PARALLEL モードで半分程度の時間での実施が可能です。 追加ロードの COPY では、インデックスを落としてロードを行う手段は有効ではありません。 インデックスの再作成の際に既存のデータもインデックスしなければならないためです。
項目 | 時間 | 時間比 |
---|---|---|
COPY with indexes | 140 sec | - |
COPY without indexes + CREATE INDEX |
187 sec (62 sec + 60 sec + 65 sec) |
133.6 % |
pg_bulkload (DIRECT) with indexes |
93 sec | 66.4 % |
pg_bulkload (PARALLEL) with indexes |
70 sec | 50.0 % |
pg_bulkload は インデックス作成処理において maintenance_work_mem の影響を受けます。 この値を大きくすることでさらにロードが高速になる可能性があります。 ここでは、maintenance_work_mem が 64 MB と 1 GB の場合で 15 % 程度処理時間に差が出ています。
pg_bulkload の FILTER 機能を用いることで、入力データを柔軟に編集しながらロードすることができますが、性能へのトレードオフがあります。 この検証では、SQL関数を利用する場合には2倍以上、C言語関数を利用する場合には 1.3倍強 までロード時間が増加しました。
項目 | 時間 | ||
---|---|---|---|
初期ロード(4GB) | 追加ロード(1GB) | ||
MWM = 64 MB | DIRECT | 397 sec | 109 sec |
MWM = 1 GB | |||
DIRECT | 334 sec | 93 sec | |
DIRECT with SQL FILTER | 801 sec | 216 sec | |
DIRECT with C FILTER | 456 sec | 126 sec |
項目 | 値 |
---|---|
Server | Dell PowerEdge R410 |
CPU | Intel Xeon E5645 (2.4GHz) 12 core * 2 |
Memory | 32GB |
Disks | SAS 10000rpm 2TB * 4 |
OS | CentOS 6.2 (64bit) |
PostgreSQL version | 9.3.4 |
pg_bulkload version | 3.1.6 |
shared_buffers | 3210MB |
checkpoint_segments | 300 |
checkpoint_timeout | 15min |
work_mem | 1MB |
maintenance_work_mem | 1GB |
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 |