TPCH数据使用说明
表模式:
TPCH官网链接:TPC-H Homepage
同学们可以自行下载TPCH-tools自行生成数据(10GB),下面主要是以mysql为例说明TPC-H的使用方法。
供同学自行参考:
windows :TPC-H测试的数据库模式生成及其数据导入MySQL的教程记录
postgresql使用(一):TPC-H tools生成数据集并导入至postgre的数据库_tpch-tools
生成好的10GB的TPC-H数据:https://www.alipan.com/s/Ttu3gGjrHDc
其实只要生成好数据文件,通过数据库自带的load或者copy命令导入就可以了;如果想手动导入可以首先通过dss.ddl 和 dss.ri里面的语句进行表的创建和约束的创建,然后使用load/copy导入数据即可
以下教程适用于Linux系统下MySQL数据库导入TPC-H数据。
如果是windows下的kingbase系统,请参考5.Kingbase导入TPC-H数据
1. 下载和修改
将下载得到的安装包上传到服务器上,重命名后解压:
unzip tpc-h.zip
后续大部分的 修改、编译、执行等操作都在tpc-h/dbgen
目录下完成
cd mysql-tpc-h/dbgen
1.1 修改makefile文件
该文件约束了 编译 后可执行文件的部分条件以及需要的依赖。
cp makefile.suite makefile
vim makefile
# 修改 103 109 110 111 这四行的内容
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
# 如果你是MySQL数据库
DATABASE= MYSQL
MACHINE = LINUX
WORKLOAD = TPCH
# 如果你是PG数据库
DATABASE= POSTGRESQL
MACHINE = LINUX
WORKLOAD = TPCH
后续都以mysql为例进行说明,如果你是postgres,可以参考postgresql使用(一):TPC-H tools生成数据集并导入至postgre的数据库_tpch-tools
或者其他数据库,可以自行寻找相关资料。
1.2 修改tpc-d.h文件
// MySQL
#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
// PG
#ifdef POSTGRESQL
#define GEN_QUERY_PLAN "EXPLAIN"
#define START_TRAN "BEGIN TRANSACTION"
#define END_TRAN "COMMIT"
#define SET_OUTPUT ""
#define SET_ROWCOUNT "LIMIT %d\n"
#define SET_DBASE ""
#endif
1.3 编译
在dbgen目录下进行编译,可能需要安装gcc-c++
make
# 或者
make -f makefile.suite
2. TPC-H 数据的生成、导入及查询生成
2.1 生成 <table>.tbl
数据文件
可以使用 ./dbgen -h
命令查看,也可以查看 README
中对 dbgen
的相关介绍。
使用命令生成符合基准的8张表与相应的数据。由介绍可知, -s
后面是数据量的大小,若为 10 则生成 10GB 数据,若为100则生成100GB的数据。
-V :显示进度消息
-f :覆盖原始数据
-s : 生成数据的总体规模
# 生成数据
./dbgen -vf -s 10
# 查看生成的数据 应该是8张表的数据
ls *.tbl
2.2 导入构建脚本文件
编译之后有dss.ddl
和dss.ri
两个脚本,dss.ddl是建表脚本,dss.ri脚本是建立主键外键关联关系。
因为TPC-H benchmark本身不支持MySQL;并且由于MySQL的表名、库名等默认都是严格区分大小写的,而 dss.ddl
(建表脚本)与 dss.ri
(表约束脚本)中使用的都是大写的数据库名与表名,但是提供的 22 条查询语句又使用的小写的表名。所以需要先修改这两个脚本。
修改 dss.ddl
在文件开头添加以下语句:
DROP DATABASE IF EXISTS tpch;
CREATE DATABASE tpch;
USE tpch;
修改 dss.ri
-- Sccsid: @(#)dss.ri 2.1.8.1
-- tpch Benchmark Version 8.0
-- CONNECT TO tpch;
USE tpch;
-- ALTER TABLES TO DROP PRIMARY KEYS
-- 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;
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 FOREIGN KEYS
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 FOREIGN KEYS
ALTER TABLE tpch.ORDERS ADD FOREIGN KEY orders_FK1 (O_CUSTKEY) REFERENCES tpch.CUSTOMER (C_CUSTKEY);
COMMIT WOR