一、TPC系列

二、最新2.18.0 TPC-H标准

8个关系表:customer.tbl、lineitem.tbl、nation.tbl、orders.tbl、partsupp.tbl、part.tbl、region.tbl、supplier.tbl,其中,nation.tbl和region.tbl表数据量不变,其它表数据量与比例因子(SF)有关。

数据库关系图:

img

三、TPC-H工具使用(MySQL为例)

下载TPC-H工具

从TPC官网下载

编译

snippet.bash
[yz@MiWiFi-R4A-srv ~]$ cd 2.18.0_rc2/
[yz@MiWiFi-R4A-srv 2.18.0_rc2]$ cd dbgen/
snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ cp makefile.suite Makefile
[yz@MiWiFi-R4A-srv dbgen]$ vim Makefile
CC=gcc
DATABASE=MYSQL
MACHINE =LINUX
WORKLOAD =TPCH

定义MySQL方言:

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ vim tpcd.h
# 添加以下定义:
#ifdef  MYSQL
#define GEN_QUERY_PLAN  ""
#define START_TRAN      ""
#define END_TRAN        ""
#define SET_OUTPUT      ""
#define SET_ROWCOUNT    "limit %d;\n"
#define SET_DBASE       ""
#endif

编译:

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ make

生成数据

dbgen -h命令可查看命令帮助。

-s 10表示产生10个Scale Factor数据,1SF=1GB数据。以生成1s数据为例:

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ ./dbgen -s 1 -f
TPC-H Population Generator (Version 2.18.0)
Copyright Transaction Processing Performance Council 1994 - 2010

生成数据如下:

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ ll *.tbl
-rw-rw-r--. 1 yz yz  24346144 519 20:56 customer.tbl
-rw-rw-r--. 1 yz yz 759863287 519 20:56 lineitem.tbl
-rw-rw-r--. 1 yz yz      2224 519 20:56 nation.tbl
-rw-rw-r--. 1 yz yz 171952161 519 20:56 orders.tbl
-rw-rw-r--. 1 yz yz 118984616 519 20:56 partsupp.tbl
-rw-rw-r--. 1 yz yz  24135125 519 20:56 part.tbl
-rw-rw-r--. 1 yz yz       389 519 20:56 region.tbl
-rw-rw-r--. 1 yz yz   1409184 519 20:56 supplier.tbl

生成的tbl文件行尾不加分隔符

默认情况下,dbgen生成的数据表以“|”分割列,行尾也有“|”分隔符,但是有些数据库的加载程序不支持以分隔符结尾,所以需要在生成数据后去除行尾的分隔符。

如果希望生成的数据行尾不带分隔符,需要对TPC-H tool代码做个小修订,编辑dbgen/config.h配置文件:

snippet.c
#define EOL_HANDLING

重新编译。

生成查询SQL

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ DSS_QUERY=queries ./qgen -s 1 | sed -e 's/\r//' > tpch_query.sql

修改查询错误:

snippet.sql
    (1) "day (3)" => "day"
    (2) "limit -1" => "limit 1"
    (3) 去除"limit"前一行多余的分号(vim:%s/;\nlimit/^Mlimit)
        vim输入^M: Ctrl-v, Ctrl-m
    (4) query 13:
        "count(o_orderkey)"
            =>
        "count(o_orderkey) as c_count"
 
        ") as c_orders (c_custkey, c_count)"
            =>
        ") as c_orders"
 
    (5) query 15:
                s_suppkey;
        DROP VIEW revenue0
        LIMIT 1;
            =>
                s_suppkey
        LIMIT 1;
        DROP VIEW revenue0;
 
    (6) INTERVAL:
        INTERVAL 'i' DAY    => INTERVAL i DAY
        INTERVAL 'j' MONTH  => INTERVAL j MONTH
        INTERVAL 'k' YEAR   => INTERVAL k YEAR
    (7) 删除头部注释行,用例内部不留空行,用例之间以2空行分隔

create view revenue0查询与其后面的select作为一个用例,且中间不留空行。

将tpch_querys.sql拆分为22个文件:q1.sql, q2.sql, …, q22.sql

snippet.bash
[yz@MiWiFi-R4A-srv dbgen]$ awk -v RS="\n\n" 'BEGIN {n=1}{print $0 > "q"n++".sql"}' tpch_query.sql
[yz@MiWiFi-R4A-srv dbgen]$ ls *.sql
q10.sql  q13.sql  q16.sql  q19.sql  q21.sql  q24.sql  q3.sql  q6.sql  q9.sql
q11.sql  q14.sql  q17.sql  q1.sql   q22.sql  q25.sql  q4.sql  q7.sql 
q12.sql  q15.sql  q18.sql  q20.sql  q23.sql  q2.sql   q5.sql  q8.sql