MySQLでTPC-Hベンチマークを実行する

DSS (Decision Support System) のベンチマークであるTPC-HMySQLで実行してみます。

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のダウンロードと展開
  • dss.ddl, dss.ri, tpcd.hに対してパッチを適用し、その後dbgen, qgenコンパイル
  • dbgen, qgenのラッパースクリプトの設置

DBGENのダンロード先とラッパースクリプトの設置先はそれぞれシェル変数SRC_DIRBIN_DIRで指定します。
今回はSRC_DIR~/srcBIN_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)

通常dbgenqgenを実行するときには辞書ファイルやクエリテンプレートを指定しなければいけないのですが、ラッパースクリプトではその辺の指定をしなくても済むようにしています。 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

などで実行するだけです。