MySQLでTPC-Hベンチマークを実行する
DSS (Decision Support System) のベンチマークであるTPC-HをMySQLで実行してみます。
HammerDB というTPC-Hを実行できるベンチマークツールも存在するのですが、今回は公式に配布されるデータロードプログラムのDBGENとクエリ作成プログラムのQGENを使用します。
環境
前提
- MySQLがインストールされていること
mysqld
が動いてること
手順
TPC-H用のデータベースとユーザの作成
TPC-H用のデータベースtpch
とクエリを実行するユーザーtpch
を作成します。
わかりやすさのためtpch
としていますが、別に何でもいいと思います。
ユーザーtpch
にはデータベースtpch
の権限を与えておきます。
$ mysql -u root -p mysql> CREATE DATABASE tpch; Query OK, 1 row affected (0.00 sec) mysql> CREATE USER 'tpch'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL ON tpch.* to 'tpch'@'localhost'; Query OK, 0 rows affected (0.00 sec)
DBGEN, QGENのセットアップ
DBGENとQGENは公式ページ TPC-H - Homepage の右のリンクからダウンロードできますが、MySQLで実行するには何点かの修正パッチが必要です。
ダウンロードとパッチの適用などをしてくれるスクリプトinstall-dbgen.sh
を書いたので、それを用います。
install-dbgen.sh
が行うことは以下の通りです。
DBGENのダンロード先とラッパースクリプトの設置先はそれぞれシェル変数SRC_DIR
とBIN_DIR
で指定します。
今回はSRC_DIR
に~/src
、BIN_DIR
に~/bin
を指定します。
$ cd ~/src $ git clone git://github.com/itiut/tpch-mysql $ BIN_DIR=~/bin SRC_DIR=~/src ./tpch-mysql/install-dbgen.sh
install-dbgen.sh
のソースはこちらから。itiut/tpch-mysql
修正点は以下の通りです。
- データベース名とテーブル名を大文字から小文字に変更 (
dss.ddl
,dss.ri
) - コメントの文法を修正 (
dss.ri
) - 外部キー作成クエリに参照先のカラム名を追加 (
dss.ri
) - MySQL用のヘッダ定義を追加 (
tpcd.h
) - クエリのテンプレートをMySQLの文法に修正 (
queries/*.sql
)
通常dbgen
とqgen
を実行するときには辞書ファイルやクエリテンプレートを指定しなければいけないのですが、ラッパースクリプトではその辺の指定をしなくても済むようにしています。
tpch-mysql/queries
にあるクエリテンプレートとSRC_DIR
にダウンロードしたDBGENをそのまま使うので、変更や削除はしないで下さい。
テーブルの作成
dbgen
と同じディレクトリにある、テーブル作成用のクエリdss.ddl
を実行してテーブルを作成します。
$ cd ~/src/tpch_2_17_0/dbgen $ mysql -u tpch -D tpch < dss.ddl
dbgen
を用いてデータを作成
BIN_DIR
に指定したディレクトリが環境変数PATH
中にあれば、dbgen
が使えます。
dbgen
の基本的な使い方としては、-s
オプションでScale Factorというデータのサイズの指標を変更します。Scale Factorが大きいときには、データを分割して作成することもできます。
データは拡張子が.tbl
のファイルとして作成されます。
$ dbgen -s 1 $ ls *.tbl customer.tbl lineitem.tbl nation.tbl orders.tbl partsupp.tbl part.tbl region.tbl supplier.tbl
データベースにデータをロード
作成したデータのファイル名から拡張子を除いたものが同じ名前のテーブルに対応しているので、対応するテーブルにデータをロードします。
$ for tbl_file in *.tbl; do mysql -u tpch -D tpch -e "LOAD DATA LOCAL INFILE '$tbl_file' INTO TABLE $(basename $tbl_file .tbl) FIELDS TERMINATED by '|' LINES TERMINATED BY '\n';"; done
インデックスを作成
dbgen
と同じディレクトリにある、インデックス作成用のクエリdss.ri
を実行してインデックスを作成します。
$ mysql -u tpch -D tpch < dss.ri
qgen
を用いてクエリを作成
qgen
も-s
オプションでScale Factorを指定します。
1~22のクエリ番号を指定してクエリを個別に作成できます。
$ for i in $(seq 1 22); do qgen -s 1 $i > $i.sql; done $ ls *.sql 10.sql 11.sql 12.sql 13.sql 14.sql 15.sql 16.sql 17.sql 18.sql 19.sql 1.sql 20.sql 21.sql 22.sql 2.sql 3.sql 4.sql 5.sql 6.sql 7.sql 8.sql 9.sql
後はこれらのクエリを
$ mysql -u tpch -D tpch < 1.sql
などで実行するだけです。