DBGENを使って、PostgreSQLにTPC-H測定用データを格納
DBGEM導入
1. DBGENのダウンロード、展開
TPC-Hのサイトからダウンロードします。
$ wget http://www.tpc.org/tpch/spec/tpch_2_17_0.zip $ unzip tpch_2_17_0.zip
2. DBGENのインストール
makefile.suiteを環境に合わせて書き換えます。
$ cd tpch_2_17_0/dbgen $ vi makefile.suite
今回は、
で試しています。
以下の部分だけ変更しました。
CC = gcc DATABASE= ORACLE MACHINE = LINUX WORKLOAD = TPCH LDFLAGS = -O3
そして、コンパイル。
$ make -f makefile.suite
dbgenとqgenという実行ファイルが生成されます。
3. テストデータ生成
$ ./dbgen -s 10
-s オプションで生成されるデータのスケールを決めます。 上記で10GBのテストデータが生成されます。 以下のファイルが生成されていれば成功だと思います。
- customer.tbl
- lineitem.tbl
- nation.tbl
- orders.tbl
- part.tbl
- partsupp.tbl
- region.tbl
- supplier.tbl
PostgreSQLにテストデータをロード
データベース作成とかは省略。 testdbというデータベースを作成したものとします。
1. テーブルを作成
dbgen ディレクトリの配下に、dll文が用意されているのでそれを利用します。
$ psql -d testdb -f dss.ddl
これは特に変更しなくても使えました。
2. データをロード
COPY文を使って"*.tbl"をロードします。 が、そのままでは失敗します。。。
DBGENは、テストデータの行末にデリミタを入れるのですが
1|AMERICA|hs use ironic, even requests. s|
PostgreSQLは最後のデリミタの右側にデータがあると怒ります。。。
testdb=# copy region from '/home/postgres/tpch_data/region.tbl' with delimiter '|'; ERROR: extra data after last expected column CONTEXT: COPY region, line 1: "0|AFRICA|lar deposits. blithely final packages cajole. regular waters are final requests. regular ac..."
この解決方法ですが色々調べた結果、 sedコマンドからのパイプラインとCOPY文の標準入力からのロード機能を使うのがスマートで良さそうです。
$ sed -e 's/|$//' supplier.tbl | psql -d testdb -c "copy supplier from STDIN ( delimiter '|');"
ちなみにデフォルトの設定だと、チェックポイントの間隔が身近すぎるとWARNINGを出されるので設定を変えておくと良いかもしれません。
3. 制約の追加
dss.riを使ってインデックスを追加します。 ただし、これも修正が必要です。
修正点は以下
- 文の削除
- -- CONNECT TO TPCD;
- -- COMMIT WORK;
- 各テーブル名からTPCDスキーマの削除
- 外部キーの追加文の修正
外部キーの追加文は
ALTER TABLE NATION ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references REGION;
となっているものを
ALTER TABLE NATION ADD FOREIGN KEY (N_REGIONKEY) references REGION(R_REGIONKEY);
と変えました。 そして実行。
$ psql -d testdb -f dss.ri
データのロード、インデックスの追加はかなり時間がかかりますのでコーヒーでも飲みながら気長に待ちましょう。