---
title: 编译和安装TPC-H测试工具包
description: "编译和安装TPC-H测试工具包之前，需要对工具包做一些修改。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/testguide/tstg/kunpengtpch_02_0005.html
sourcePath: /source/zh/kunpengdbs/testguide/tstg/kunpengtpch_02_0005.html
indexId: cd8098fd24098391a4928dbb629562652db21bd568703bf9a22299fee1a9592261
---
# 编译和安装TPC-H测试工具包

编译和安装TPC-H测试工具包之前，需要对工具包做一些修改。

1. 将TPC-H测试工具包放到MySQL环境“/home”目录或者其他目录下。要求磁盘空间大于后续5中生成的.tbl数据文件的大小。
2. 修改makefile文件。

  a. 解压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

  b. 按“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
#
```


  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 将文件名从makefile.suite更改为makefile。这样，在    4.b
中使用make命令时，才能正确地应用修改后的内容。
    1 cp makefile.suite makefile

3. 修改tpcd.h文件。

  a. 打开tpcd.h文件。
    1 vim tpcd.h

  b. 按“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

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
4. 生成dbgen可执行文件。

  a. 进入dbgen目录。“/home/tpch-pq/2.18.0_rc2/dbgen/”为dbgen目录，请根据实际情况填写。
    1 cd /home/tpch-pq/2.18.0_rc2/dbgen/

  b. 执行make命令。命令执行完成后，您将在dbgen文件夹中看到许多.o格式的文件和一个dbgen可执行文件。
    1 make

5. 在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。

6. 修改初始化脚本。
压缩包中包含两个脚本：dss.ddl用于创建表，dss.ri用于关联表中的主键和外键。这些脚本需要进行修改才能在MySQL中使用。
修改dss.ddl

  a. 为了建立MySQL数据库连接，需要在dss.ddl的开头添加一些命令。在dss.ddl的最前面加上以下代码：
    1 2 3 DROP DATABASE tpch; CREATE DATABASE tpch; USE tpch;

  b. 考虑到TPC-H自带的测试用表名是小写的，而DSS.DDL中的表名是大写的，为了保持一致性，建议将表名改为小写。
    打开dss.ddl。 1 vi dss.ddl

    按“ESC”
    键进入命令行模式，输入以下命令将表名改为小写，按回车键完成输入。

```
:%s/TABLE\(.*\)/TABLE\L\1
```


修改dss.ri

  a. 打开dss.ri。
    1 vi dss.ri

  b. 按“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;
```


  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
7. 创建tpch数据库和数据表，并在MySQL数据库中导入ddl文件。在本例中，“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径，请根据实际情况修改。

```
\.
/home/tpch-pq/2.18.0_rc2
/dbgen/dss.ddl
```


  查看数据库。使用如下语句查询是否创建成功，可以看到新增了一个名为tpch的数据库。 1 SHOW DATABASES;

8. 在MySQL数据库中导入dds.ri文件。在本例中，“/home/tpch-pq/2.18.0_rc2”为服务器上的实际路径，请根据实际情况修改。
  1 \. /home/tpch-pq/2.18.0_rc2/dbgen/dss.ri

9. 导入数据。

  a. 在dbgen目录下创建一个load.sh脚本文件。
    1 vi load.sh

  b. 按“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

  c. 按“Esc”键，输入:wq!，按“Enter”保存并退出编辑。
  d. 执行load.sh脚本。
    1 sh load.sh

    同目录下将会生成一个loaddata.sql文件，里面是从8个tbl里导入数据的SQL语句。

  e. 导入数据：
    1 mysql --local-infile -uroot -p123456 -S /data/mysql/run/mysql.sock < loaddata.sql

    数据量越大，导入时间越久。请耐心等待。

  f. 验证是否导入成功。可以登录数据库里查看8个表，如果有数据，表示数据导入成功。
10. 在dbgen目录下生成查询SQL语句。

  a. 将qgen执行文件和dists.dss文件拷贝到queries模板目录中。
    1 cp qgen dists.dss queries/

    通过ll命令可以查看到已经拷贝成功。

    1 ll

  b. 在dbgen上级目录下创建saveSql文件夹。
    1 mkdir ../saveSql

  c. 进入queries目录。
    1 cd queries

  d. 在queries目录下生成查询SQL语句。

    - 如果需要生成22条SQL语句，请执行如下命令：

```
for i in {1..22};do ./qgen -d ${i} > ../../saveSql/${i}.sql;done
```


    - 如果需要生成指定的SQL语句，请执行对应序号的命令，例如需要生成1.sql的查询语句：

```
./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目录下快速删除，输入命令： 1 sed \-i "s/limit\ \-1;//g" \*.sql | 1 | sed \-i "s/limit\ \-1;//g" \*.sql |
| 1 | sed \-i "s/limit\ \-1;//g" \*.sql |  |  |
| 2.sql、3.sql、10.sql、18.sql、21.sql | 删除倒数第二行的分号 |  |  |


例如在1.sql文件中删除(3)和limit -1;。
