だれかのメモ帖

テクノロジー全般のメモ

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

データのロード、インデックスの追加はかなり時間がかかりますのでコーヒーでも飲みながら気長に待ちましょう。