赞
踩
简介
TPC-H 是一个决策支持基准测试 (Decision Support Benchmark),用于模拟复杂的决策支持系统环境。主要测试数据库的查询和报表性能,通常用于评估数据库在处理大规模数据时的性能表现。
TPC-H 基准测试由一组预定义的 SQL 查询组成,这些查询涉及大数据集上的多表连接、聚合等复杂操作。通过执行这些查询并测量其性能,可以评估数据库系统处理复杂决策支持工作负载的能力。
文章目录如下
TPC官网
GitHub 仓库(V 2.17.3)
(这里以 GitHub 仓库下载的 2.17.3 版本为例)
编辑项目定义的头文件 tpch-kit-master/dbgen/tpcd.h,不同的数据库使用不用的定义。文件中内置了一些数据库,比如 Oracle:
- #ifdef ORACLE
- ......
根据自己需要使用的数据库配置,如果文件中已经包含了,那么不需要配置。如果没有可以参考下方,增加到文件中即可。
【Oracle定义】
- #ifdef ORACLE
- #define GEN_QUERY_PLAN ""
- #define START_TRAN ""
- #define END_TRAN ""
- #define SET_OUTPUT ""
- #define SET_ROWCOUNT "where rownum <= %d;\n"
- #define SET_DBASE ""
- #endif
【SQLServer定义】
- #ifdef SQLSERVER
- #define GEN_QUERY_PLAN "set showplan on\nset noexec on\ngo\n"
- #define START_TRAN "begin transaction\ngo\n"
- #define END_TRAN "commit transaction\ngo\n"
- #define SET_OUTPUT ""
- #define SET_ROWCOUNT "set rowcount %d\ngo\n\n"
- #define SET_DBASE "use %s\ngo\n"
- #endif
【PostgreSQL定义】
- #ifdef POSTGRESQL
- #define GEN_QUERY_PLAN "explain"
- #define START_TRAN "start transaction"
- #define END_TRAN "commit;"
- #define SET_OUTPUT ""
- #define SET_ROWCOUNT "limit %d;\n"
- #define SET_DBASE ""
- #endif
【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
编辑编译文件 tpch-kit-master/dbgen/Makefile,找到如下内容按情况修改
- ################
- ## CHANGE NAME OF ANSI COMPILER HERE
- ################
- CC = gcc
- # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
- # SQLSERVER, SYBASE, ORACLE, VECTORWISE, POSTGRESQL
- # Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, MACOS
- # SGI, SUN, U2200, VMS, LINUX, WIN32
- # Current values for WORKLOAD are: TPCH
- DATABASE = MYSQL
- MACHINE = LINUX
- WORKLOAD = TPCH
上述2个文件配置完成后,cd tpch-kit-master/dbgen/ 执行 make 命令
编译完成后会自动生成2个执行文件
需要注意:直接执行 qgen 会出现找不到的错误
设置环境变量
export DSS_QUERY=./queries
再次执行qgen(成功),生成22条复杂查询SQL
tpch-kit-master 工具并不具备直接测试的能力,主要作用是根据TPC-H标准生成对应的测试数据,包括:测试表、索引、csv测试数据和22条复杂查询语句。下面介绍它的基本用法:
将安装包解压后会会存在如下2个文件:
创建表语句如下:
- -- 记录各个国家的信息
- CREATE TABLE nation(
- n_nationkey INTEGER NOT NULL, -- 国家键
- n_name CHAR(25) NOT NULL, -- 国家名称
- n_regionkey INTEGER NOT NULL, -- 所属地区键
- n_comment VARCHAR(152) -- 注释
- );
-
- -- 记录各个地区的信息
- CREATE TABLE region(
- r_regionkey INTEGER NOT NULL, -- 地区键
- r_name CHAR(25) NOT NULL, -- 地区名称
- r_comment VARCHAR(152) -- 注释
- );
-
- -- 记录零件的信息
- CREATE TABLE part(
- p_partkey INTEGER NOT NULL, -- 零件键
- p_name VARCHAR(55) NOT NULL, -- 零件名称
- p_mfgr CHAR(25) NOT NULL, -- 制造商
- p_brand CHAR(10) NOT NULL, -- 品牌
- p_type VARCHAR(25) NOT NULL, -- 类型
- p_size INTEGER NOT NULL, -- 尺寸
- p_container CHAR(10) NOT NULL, -- 容器
- p_retailprice DECIMAL(15,2) NOT NULL, -- 零售价格
- p_comment VARCHAR(23) NOT NULL -- 注释
- );
-
- -- 记录供应商的信息
- CREATE TABLE supplier(
- s_suppkey INTEGER NOT NULL, -- 供应商键
- s_name CHAR(25) NOT NULL, -- 供应商名称
- s_address VARCHAR(40) NOT NULL, -- 地址
- s_nationkey INTEGER NOT NULL, -- 所属国家键
- s_phone CHAR(15) NOT NULL, -- 电话
- s_acctbal DECIMAL(15,2) NOT NULL, -- 账户余额
- s_comment VARCHAR(101) NOT NULL -- 注释
- );
-
- -- 记录零件和供应商之间的关系,包括供应商为特定零件提供的信息,如价格、供应量等
- CREATE TABLE partsupp(
- ps_partkey INTEGER NOT NULL, -- 零件键
- ps_suppkey INTEGER NOT NULL, -- 供应商键
- ps_availqty INTEGER NOT NULL, -- 可用数量
- ps_supplycost DECIMAL(15,2) NOT NULL, -- 供应成本
- ps_comment VARCHAR(199) NOT NULL -- 注释
- );
-
- -- 记录顾客的信息
- CREATE TABLE customer(
- c_custkey INTEGER NOT NULL, -- 客户键
- c_name VARCHAR(25) NOT NULL, -- 客户名称
- c_address VARCHAR(40) NOT NULL, -- 地址
- c_nationkey INTEGER NOT NULL, -- 所属国家键
- c_phone CHAR(15) NOT NULL, -- 电话
- c_acctbal DECIMAL(15,2) NOT NULL, -- 账户余额
- c_mktsegment CHAR(10) NOT NULL, -- 市场细分
- c_comment VARCHAR(117) NOT NULL -- 注释
- );
-
- -- 记录订单的信息
- CREATE TABLE orders(
- o_orderkey INTEGER NOT NULL, -- 订单键
- o_custkey INTEGER NOT NULL, -- 客户键
- o_orderstatus CHAR(1) NOT NULL, -- 订单状态
- o_totalprice DECIMAL(15,2) NOT NULL, -- 总价
- o_orderDATE DATE NOT NULL, -- 订单日期
- o_orderpriority CHAR(15) NOT NULL, -- 订单优先级
- o_clerk CHAR(15) NOT NULL, -- 业务员
- o_shippriority INTEGER NOT NULL, -- 发货优先级
- o_comment VARCHAR(79) NOT NULL -- 注释
- );
-
- -- 记录订单中每个零件的明细信息
- CREATE TABLE lineitem(
- l_orderkey INTEGER NOT NULL, -- 订单键
- l_partkey INTEGER NOT NULL, -- 零件键
- l_suppkey INTEGER NOT NULL, -- 供应商键
- l_linenumber INTEGER NOT NULL, -- 行号
- l_quantity DECIMAL(15,2) NOT NULL, -- 数量
- l_extendedprice DECIMAL(15,2) NOT NULL, -- 扩展价格
- l_discount DECIMAL(15,2) NOT NULL, -- 折扣
- l_tax DECIMAL(15,2) NOT NULL, -- 税
- l_returnflag CHAR(1) NOT NULL, -- 退货标志
- l_linestatus CHAR(1) NOT NULL, -- 行状态
- l_shipDATE DATE NOT NULL, -- 发货日期
- l_commitDATE DATE NOT NULL, -- 提交日期
- l_receiptDATE DATE NOT NULL, -- 接收日期
- l_shipinstruct CHAR(25) NOT NULL, -- 发货指令
- l_shipmode CHAR(10) NOT NULL, -- 发货模式
- l_comment VARCHAR(44) NOT NULL -- 注释
- );
创建主键、外键索引
- -- 清理8张表主键
- ALTER TABLE region DROP CONSTRAINT region_pkey;
- ALTER TABLE nation DROP CONSTRAINT nation_pkey;
- ALTER TABLE part DROP CONSTRAINT part_pkey;
- ALTER TABLE supplier DROP CONSTRAINT supplier_pkey;
- ALTER TABLE partsupp DROP CONSTRAINT partsupp_pkey;
- ALTER TABLE orders DROP CONSTRAINT orders_pkey;
- ALTER TABLE lineitem DROP CONSTRAINT lineitem_pkey;
- ALTER TABLE customer DROP CONSTRAINT customer_pkey;
-
- -- 创建主键
- ALTER TABLE region ADD PRIMARY KEY (r_regionkey);
- ALTER TABLE nation ADD PRIMARY KEY (n_nationkey);
- ALTER TABLE part ADD PRIMARY KEY (p_partkey);
- ALTER TABLE supplier ADD PRIMARY KEY (s_suppkey);
- ALTER TABLE partsupp ADD PRIMARY KEY (ps_partkey,ps_suppkey);
- ALTER TABLE customer ADD PRIMARY KEY (c_custkey);
- ALTER TABLE lineitem ADD PRIMARY KEY (l_orderkey,l_linenumber);
- ALTER TABLE orders ADD PRIMARY KEY (o_orderkey);
-
- -- 创建外键
- ALTER TABLE nation ADD CONSTRAINT nation_fk1 FOREIGN KEY (n_regionkey) REFERENCES region;
- ALTER TABLE supplier ADD CONSTRAINT supplier_fk1 FOREIGN KEY (s_nationkey) REFERENCES nation;
- ALTER TABLE customer ADD CONSTRAINT customer_fk1 FOREIGN KEY(c_nationkey) REFERENCES nation;
- ALTER TABLE partsupp ADD CONSTRAINT partsupp_fk1 FOREIGN KEY (ps_suppkey) REFERENCES supplier;
- ALTER TABLE partsupp ADD CONSTRAINT partsupp_fk2 FOREIGN KEY (ps_partkey) REFERENCES part;
- ALTER TABLE orders ADD CONSTRAINT orders_fk1 FOREIGN KEY (o_custkey) REFERENCES customer;
- ALTER TABLE lineitem ADD CONSTRAINT lineitem_fk1 FOREIGN KEY (l_orderkey) REFERENCES orders;
- ALTER TABLE lineitem ADD CONSTRAINT lineitem_fk2 FOREIGN KEY (l_partkey,l_suppkey) REFERENCES partsupp;
使用二进制工具 tpch-kit-master/dbgen/dbgen 来生成csv文件,基本参数如下:
- -h # 帮助
- -q # 启用静默模式
- -v # 启用详细模式
-
- -f # 覆盖现有文件
- -s <n> # 比例因子,数据规模以GB为单位(默认: 1G)
- -U <n> # 生成 <n> 更新设置
-
- -T # 指定生成某张表的数据
- -T c # 只生成cutomers表数据
- -T l # 只生成nation/region表数据
- -T L # 只生成lineitem表数据
- -T n # 只生成nation表数据
- -T o # 只生成orders/lineitem表数据
- -T O # 只生成orders表数据
- -T p # 只生成parts/partsupp表数据
- -T P # 只生成parts表数据
- -T r # 只生成region表数据
- -T s # 只生成suppliers表数据
- -T S # 只生成partsupp表数据
通过 dbgen [参数] 来生成数据,执行完成后会自动将数据保存到 tpch-kit-master/dbgen/*.tbl
【案例一】生成1GB数据
./dbgen
【案例二】生成2GB数据,覆盖原有文件,并输出详细信息
./dbgen -vfs 2
【案例三】指定生成customer和nation表数据
- ./dbgen -T c
- ./dbgen -T n
使用二进制工具 tpch-kit-master/dbgen/qgen 来生成22条复杂的查询语句,基本参数如下:
- -h # 帮助
- -c # 保留模板中的注释
- -d <n> # 指定输出单条SQL(1~22)
【案例一】生成全部SQL(22条)
./qgen
【案例二】指定生成第3条SQL
./qgen -d 3
【案例三】保留注释
./qgen -c -d 3
22条语句的作用如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。