SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

TPC-H のテスト環境を SQL Server に構築してみる

leave a comment

ベンチマークの指標として TPC-H があります。
今回はこの TPC-H をデータのロードから主導で実施するための方法についてまとめてみたいと思います。
本投稿は以下の記事を参考にさせていただいています。
Generate test data using DBGen
TPC-H generate test data , test queries and sql database benchmark
Create the tpc-h database schema for SQL Server
チュートリアル的なデータベースの用意(tpc-h)
MySQLでTPC-Hベンチマークを実行する

■TPC-H のモジュールの入手


TPC-H のデータは dbgen.exe を使用することで作成することができます。
私はよく HammerDB を使用しており、このソフトでも TPC-H の環境を作成することができるのですが、データの作成もツール内で実施されるため、並列でテキストファイルをロードするテストを実行することはできません。
データのロードからテストをしたい場合には dbgen.exe をコンパイルして作成する必要があります。
TPC-H のモジュールは Transaction Processing Performance Council から入手することができます。
TPC-H に関しては こちら からダウンロードできます。
Windows 環境の場合、TPC-H のモジュールは Visual Studio または、Cygwin を使用することで、環境作成のための実行可能モジュールを作成することができます。
 

■TPC-H のデータ作成モジュールのビルド (Cygwin でコンパイル)


下で紹介している VS を使用したコンパイルよりは Cygwin に gcc を追加してコンパイルを実施したほうが早いかもしれないですね。
本投稿では、Cygwin の x64 のセットアップを使用して実行しています。
Cygwin にはコンパイル用に

  • gcc-g++: GNU Compiler Collection (C++)
  • make: The GNU version of the ‘make’ utility
  • libisl10:Integer Set Library (runtime)
  • libcloog-isl4:ClooG Chunky Loop Generator (runtime)

を追加しています。
DBGen の makefile.suite は最低限は以下の設定を追加すればよいかと。
# 冒頭で紹介した記事のコンパイル最適化オプションも先人の知恵として追加しています。

CC  = gcc
DATABASE= SQLSERVER
MACHINE = LINUX
WORKLOAD = TPCH
CGLAGS = -O3
LDFLAGS = -O3

 
makefile.suite の修正が終わったら、

make -f makefile.suite

で dbgen のコンパイルを実行します。
Cygwin から実行した場合は、dbgen.exe / qgen.exe ともにコンパイルすることが可能でした。
 

■TPC-H のデータ作成モジュールのビルド (Visual Studio でコンパイル)


ZIP 形式のファイルには、 Visual Studio のソリューションファイルが含まれており、Visual Studio Express Edition の C++ でビルドすることができます。
今回は Visual Studio 2012 Express for Windows Desktop を使用しています。
Visual Studio 2012 Express をインストールしたらダウンロードした TPC-H のモジュールを展開し、[tpch.sln] を開きます。
プロジェクトとソリューションのアップグレードが開始されますので [OK] をクリックしてアップグレードをします。
image
ソリューションが開けたら、[ビルド] → [ソリューションのビルド] をクリックし、ビルドを開始します。
image
qgen のほうでエラーが発生しますが今回使用したいものは dbgen になりますのでエラーはひとまずおいておきます。
qgen は TPC-H 用のクエリを作成するものになりますので、こちらについては冒頭で紹介したリンクのクエリで代替できるかと。
qgen で作成したクエリは、TPC-H のスケールにあわせて、WHERE 句の条件を調整しているようなので、厳密なテストでは、qgen で作成したクエリを利用するのが一番だと思いますが。
デフォルトですと debug ビルドですので、ビルドが終了するとソリューションのフォルダ内の debug の中に [dbgen.exe] が作成されているかと思います。
image
VS の場合、再配布可能モジュールがインストールされている端末では、うまく実行することができず、VS が実行されている環境でないと dbgen を動かせなかった記憶があります。
あと、Release ビルドではコンパイルが通せなかった気が。
 

■dbgen.exe の実行


Cygwin でコンパイルした場合は、cygwin1.dll にパスが通っている必要があるようですので、

SET PATH=%PATH%;C:\cygwin64\bin

を実行してから dbgen.exe を起動します。
dbgen.exe のヘルプについては、「dbgen.exe ?-?」で表示することが可能です。
この [dbgen.exe] を使用すると TPC-H のデータを作成することができるのですが実行すると以下のようなエラーになると思います。
image
dbgen.exe を実行するためには同一フォルダ内に [dists.dss] を配置しておく必要があります。
このファイルは dbgen フォルダに入っていますので、dbgen.exe を実行するためには、

  • dbgen.exe
  • dists.dss

の 2 ファイルを同じフォルダに配置しておきます。
image
これで実行の準備は完了です。
[dbgen.exe -h] でヘルプが表示できます。
image
TPC-H のデータはスケールでデータサイズを指定していくのですが 1 スケールで 1GB 程度のデータが作成されますので、必要に応じてスケール数を調整していきます。
デフォルトではテーブルごとに 1 ファイル作成されます。
1 ファイルだとデータのロードに時間がかかりますので、大きいスケールのデータを作成する場合には複数のファイルで作成するとよいと思います。
以下のようなコマンドを実行することで複数のファイルを作成することができます。

cd /D E:\dbgen
FOR /L %i IN (1,1,10) DO start E:\dbgen\dbgen.exe -v -f -s 10 -C 10 -S %i

上記のコマンドで全テーブル合計で 10GB 程度のデータが作成されます。
image
複数のファイルをシングルスレッドで作成するのは時間がかかりますので、複数のスレッドで実行しています。
今回はチャンク (-C) を 10 にしていますので、FOR で 10 回まわしながら Start で各チャンクのデータを生成するための dbgen を起動しています。
実行が終了すると以下のようにテーブル単位に 10 個のファイルが作成されますのでこれを各テーブルにインポートします。
image
 

■テーブルの作成


データができたら格納するためのテーブルを作成する必要があります。
テーブルに関しては TPC-H のモジュールのディレクトリ内の 「dss.ddl」 で作成することができます。
image
インデックスやキーの情報については、「dss.ri」に記載されていますので、「dss.ddl」「dss.ri」を使用してテーブルを作成することになります。
# インポート時にインデックスをつけておいたほうがよいかは性能との兼ね合いですが。
SQL Server 用のテーブルについては Generate test data using DBGen で公開してくださっているスキーマ定義がありますので、こちらを使用してもよいかもしれないですね。
作成したテーブルにデータを入れることで TPC-H の環境を作成することができます。
データは BULKINSERT や BCP で INSERT することができます。
作成されたファイルのデリミタは | となっていますので、これを使用してインポートをすれば環境を作成することができます。
BULKINSERT の例

BULK INSERT part FROM 'C:\tpch_2_14_3\dbgen\part.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|')
-- Cygwin で作成した場合1
BULK INSERT part FROM 'C:\tpch_2_14_3\dbgen\part.tbl' WITH (TABLOCK, DATAFILETYPE='char', CODEPAGE='raw', FIELDTERMINATOR = '|', ROWTERMINATOR = '0x0A')

 
BCP の例

bcp TPCD.dbo.SUPPLIER in supplier.tbl -f SUPPLIER.fmt -S<Serverinstance> -U<myuser>

 
この手のロードは一つのテーブルに対して複数のファイルを並列で実行したほうが早く行えますので、SSIS や複数のクエリエディタ、複数の BCP で並列に実行をしたほうがよいかと。
詳細は データ ローディング パフォーマンス ガイド が詳しいかと。
デリミタが | (パイプ) になっている関係で、bcp でインポートする場合はこの文字を考慮する必要があります。
VS で作成した dbgen から実行する場合は、

FOR /L %i IN (1,1,10) DO start bcp dbo.SUPPLIER in E:\dbgen\supplier.tbl.%i -S localhost -d tpch -T -c -t "|"
FOR /L %i IN (1,1,10) DO start bcp dbo.PART in E:\dbgen\part.tbl.%i -S localhost -d tpch -T -c -t "|"
FOR /L %i IN (1,1,10) DO start bcp dbo.PARTSUPP in E:\dbgen\partsupp.tbl.%i -S localhost -d tpch -T -c -t "|"
FOR /L %i IN (1,1,10) DO start bcp dbo.CUSTOMER in E:\dbgen\customer.tbl.%i -S localhost -d tpch -T -c -t "|"
FOR /L %i IN (1,1,10) DO start bcp dbo.ORDERS in E:\dbgen\orders.tbl.%i -S localhost -d tpch -T -c -t "|"
FOR /L %i IN (1,1,10) DO start bcp dbo.LINEITEM in E:\dbgen\lineitem.tbl.%i -S localhost -d tpch -T -c -t "|"
bcp dbo.NATION in H:dbgennation.tbl.%i -S localhostSQL2012 -d tpch -T -c -t "|"
bcp dbo.REGION in E:\dbgen\region.tbl -S localhost -d tpch -T -c -t "|"

cygwin で作成した dbgen から実行する場合は、

FOR /L %i IN (1,1,10) DO start bcp dbo.SUPPLIER in E:\dbgen\supplier.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
FOR /L %i IN (1,1,10) DO start bcp dbo.PART in E:\dbgen\part.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
FOR /L %i IN (1,1,10) DO start bcp dbo.PARTSUPP in E:\dbgen\partsupp.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
FOR /L %i IN (1,1,10) DO start bcp dbo.CUSTOMER in E:\dbgen\customer.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
FOR /L %i IN (1,1,10) DO start bcp dbo.ORDERS in E:\dbgen\orders.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
FOR /L %i IN (1,1,10) DO start bcp dbo.LINEITEM in E:\dbgen\lineitem.tbl.%i -S localhost -d tpch -T -c -t "|" -r 0x0A -h "TABLOCK"
bcp dbo.NATION in E:\dbgen\nation.tbl -S localhost -d tpch -T -c -t "|" -r 0x0A
bcp dbo.REGION in E:\dbgen\region.tbl -S localhost -d tpch -T -c -t "|" -r 0x0A

でインポートできるかと
# cygwin で作った場合、改行コードが LF になっているようでしたので。
これでデータベースの作成は完了です。
大規模なデータロードをする際のテストデータとして dbgen で作成されたデータは使えそうですね。

■TPC-H のクエリの実行


TPC-H で使用する 1 ~ 22 までのクエリですが、TPC-H の query フォルダに用意されています。
image
 
SQL Server で使える形式のものが TPC-H generate test data , test queries and sql database benchmark で公開されていますので、このクエリを利用するとよさそうです。
# query フォルダーのものは、qgen でクエリーを生成するために使用するものとなるため、そのままの利用はできない感じですかね。
またいくつかの列は日付型になっていますのでパーティションを利用するのもよさそうですね。

Share

Written by Masayuki.Ozawa

2月 2nd, 2013 at 1:24 pm

Posted in SQL Server

Tagged with

Leave a Reply