编译和安装TPC-H测试工具包
编译和安装TPC-H测试工具包之前,需要对工具包做一些修改。
- 将TPC-H测试工具包放到MySQL环境“/home”目录或者其他目录下。要求磁盘空间大于后续5中生成的.tbl数据文件的大小。
- 修改makefile文件。
- 解压zip文件,进入dbgen目录并打开makefile.suite文件。tpch-pq.zip为TPC-H测试工具包的名称,“/home/tpch-pq/2.18.0_rc2/dbgen/”为dbgen目录,请根据实际情况填写。
1 2 3
unzip tpch-pq.zip cd /home/tpch-pq/2.18.0_rc2/dbgen/ vim makefile.suite
- 按“i”进入编辑模式,将第103~112行修改为如下内容。
CC = gcc # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata) # SQLSERVER, SYBASE, ORACLE, VECTORWISE # Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, # SGI, SUN, U2200, VMS, LINUX, WIN32 # Current values for WORKLOAD are: TPCH DATABASE = MYSQL MACHINE = LINUX WORKLOAD = TPCH #
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 将文件名从makefile.suite更改为makefile。这样,在4.b中使用make命令时,才能正确地应用修改后的内容。
1cp makefile.suite makefile
- 解压zip文件,进入dbgen目录并打开makefile.suite文件。tpch-pq.zip为TPC-H测试工具包的名称,“/home/tpch-pq/2.18.0_rc2/dbgen/”为dbgen目录,请根据实际情况填写。
- 修改tpcd.h文件。
- 打开tpcd.h文件。
1vim tpcd.h - 按“i”进入编辑模式,在文件最上方添加如下宏定义。
1 2 3 4 5 6 7 8
#ifdef MYSQL #define GEN_QUERY_PLAN "" #define START_TRAN "START TRANSACTION" #define END_TRAN "COMMIT" #define SET_OUTPUT "" #define SET_ROWCOUNT "limit %d;\n" #define SET_DBASE "use %s;\n" #endif
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 打开tpcd.h文件。
- 生成dbgen可执行文件。
- 在dbgen目录下,使用如下命令生成.tbl数据文件。在本例中,-s 1表示生成1GB的数据。如果需要生成10GB的数据,将1改为10即可。
1./dbgen -s 1
执行上述命令后,dbgen工具将开始生成数据文件并保存在当前目录下。生成的数据文件包括8个表,分别是:supplier.tbl、region.tbl、part.tbl、partsupp.tbl、orders.tbl、nation.tbl、lineitem.tbl、customer.tbl。
- 修改初始化脚本。
压缩包中包含两个脚本:dss.ddl用于创建表,dss.ri用于关联表中的主键和外键。这些脚本需要进行修改才能在MySQL中使用。
修改dss.ddl
- 为了建立MySQL数据库连接,需要在dss.ddl的开头添加一些命令。在dss.ddl的最前面加上以下代码:
1 2 3
DROP DATABASE tpch; CREATE DATABASE tpch; USE tpch;
- 考虑到TPC-H自带的测试用表名是小写的,而DSS.DDL中的表名是大写的,为了保持一致性,建议将表名改为小写。
按“ESC”键进入命令行模式,输入以下命令将表名改为小写,按回车键完成输入。
1:%s/TABLE\(.*\)/TABLE\L\1
修改dss.ri
- 打开dss.ri。
1vi dss.ri - 按“i”进入编辑模式,将初始版本内容替换为以下全部内容。
- 下面“-- ALTER TABLE tpch.* DROP PRIMARY KEY;”这8行语句,需要注意每行语句前3个字符是“-- ”。
- 格式:--空格ALTER TABLE tpch.* DROP PRIMARY KEY;
-- Sccsid: @(#)dss.ri 2.1.8.1 -- tpch Benchmark Version 8.0 USE tpch; -- ALTER TABLE tpch.region DROP PRIMARY KEY; -- ALTER TABLE tpch.nation DROP PRIMARY KEY; -- ALTER TABLE tpch.part DROP PRIMARY KEY; -- ALTER TABLE tpch.supplier DROP PRIMARY KEY; -- ALTER TABLE tpch.partsupp DROP PRIMARY KEY; -- ALTER TABLE tpch.orders DROP PRIMARY KEY; -- ALTER TABLE tpch.lineitem DROP PRIMARY KEY; -- ALTER TABLE tpch.customer DROP PRIMARY KEY; -- For table region ALTER TABLE tpch.region ADD PRIMARY KEY (R_REGIONKEY); -- For table nation ALTER TABLE tpch.nation ADD PRIMARY KEY (N_NATIONKEY); ALTER TABLE tpch.nation ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.region(R_REGIONKEY); COMMIT WORK; -- For table part ALTER TABLE tpch.part ADD PRIMARY KEY (P_PARTKEY); COMMIT WORK; -- For table supplier ALTER TABLE tpch.supplier ADD PRIMARY KEY (S_SUPPKEY); ALTER TABLE tpch.supplier ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.nation(N_NATIONKEY); COMMIT WORK; -- For table partsupp ALTER TABLE tpch.partsupp ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; -- For table customer ALTER TABLE tpch.customer ADD PRIMARY KEY (C_CUSTKEY); ALTER TABLE tpch.customer ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.nation(N_NATIONKEY); COMMIT WORK; -- For table lineitem ALTER TABLE tpch.lineitem ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER); COMMIT WORK; -- For table orders ALTER TABLE tpch.orders ADD PRIMARY KEY (O_ORDERKEY); COMMIT WORK; -- For table partsupp ALTER TABLE tpch.partsupp ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.supplier(S_SUPPKEY); COMMIT WORK; ALTER TABLE tpch.partsupp ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.part(P_PARTKEY); COMMIT WORK; -- For table orders ALTER TABLE tpch.orders ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.customer(C_CUSTKEY); COMMIT WORK; -- For table lineitem ALTER TABLE tpch.lineitem ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references tpch.orders(O_ORDERKEY); COMMIT WORK; ALTER TABLE tpch.lineitem ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references tpch.partsupp(PS_PARTKEY,PS_SUPPKEY); COMMIT WORK;
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 为了建立MySQL数据库连接,需要在dss.ddl的开头添加一些命令。在dss.ddl的最前面加上以下代码:
- 创建tpch数据库和数据表,并在MySQL数据库中导入ddl文件。在本例中,“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径,请根据实际情况修改。
\. /home/tpch-pq/2.18.0_rc2/dbgen/dss.ddl
查看数据库。使用如下语句查询是否创建成功,可以看到新增了一个名为tpch的数据库。1SHOW DATABASES;
- 在MySQL数据库中导入dds.ri文件。在本例中,“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径,请根据实际情况修改。
1\. /home/tpch-pq/2.18.0_rc2/dbgen/dss.ri
- 导入数据。
- 在dbgen目录下创建一个load.sh脚本文件。
1vi load.sh - 按“i”进入编辑模式,输入以下代码。tpch为数据库名称,请根据实际情况填写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/bin/bash write_to_file() { file="loaddata.sql" if [ ! -f "$file" ] ; then touch "$file" fi echo 'USE tpch;' >> $file echo 'SET FOREIGN_KEY_CHECKS=0;' >> $file DIR=`pwd` for tbl in `ls *.tbl`; do table=$(echo "${tbl%.*}") echo "LOAD DATA LOCAL INFILE '$DIR/$tbl' INTO TABLE $table" >> $file echo "FIELDS TERMINATED BY '|' LINES TERMINATED BY '|\n';" >> $file done echo 'SET FOREIGN_KEY_CHECKS=1;' >> $file } write_to_file
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 执行load.sh脚本。
1sh load.sh同目录下将会生成一个loaddata.sql文件,里面是从8个tbl里导入数据的SQL语句。
- 导入数据:
1mysql --local-infile -uroot -p123456 -S /data/mysql/run/mysql.sock < loaddata.sql
数据量越大,导入时间越久。请耐心等待。
- 验证是否导入成功。可以登录数据库里查看8个表,如果有数据,表示数据导入成功。
- 在dbgen目录下创建一个load.sh脚本文件。
- 在dbgen目录下生成查询SQL语句。
- 将qgen执行文件和dists.dss文件拷贝到queries模板目录中。
1cp qgen dists.dss queries/
通过ll命令可以查看到已经拷贝成功。
1ll

- 在dbgen目录下创建saveSql文件夹。
1mkdir ../saveSql - 进入queries目录。
1cd queries
- 在queries目录下生成查询SQL语句。
- 如果需要生成22条SQL语句,请执行如下命令:
1for i in {1..22};do ./qgen -d ${i} > ../../saveSql/${i}.sql;done
- 如果需要生成指定的SQL语句,请执行对应序号的命令,例如需要生成1.sql的查询语句:
1./qgen -d 1 > ../../saveSql/1.sql
由于TPC-H没有适配MySQL,因此生成的SQL文件无法在MySQL上运行,需要到saveSql目录下打开生成的SQL文件,并按照表1修改并保存,以适配MySQL。在本例中,SQL文件的路径为“/home/tpch-pq/2.18.0_rc2/saveSql/”。
表1 SQL文件修改说明 SQL文件名称
对应修改说明
1.sql
删除day后面的(3)
1.sql、4.sql、5.sql、6.sql、7.sql、8.sql、9.sql、11.sql、12.sql、13.sql、14.sql、15.sql、16.sql、17.sql、19.sql、20.sql、22.sql、
删除最后一行的limit -1;
可以在saveSql目录下快速删除,输入命令:
1sed -i "s/limit\ -1;//g" *.sql
2.sql、3.sql、10.sql、18.sql、21.sql
删除倒数第二行的分号
例如在1.sql文件中删除(3)和limit -1;。

- 如果需要生成22条SQL语句,请执行如下命令:
- 将qgen执行文件和dists.dss文件拷贝到queries模板目录中。
父主题: 使用TPC-H