TPCH 标准测试集

2023-09-23 warehouse database

由事务处理委员会提供的基准测试集。

简介

用来模拟决策支持类的应用。

下载代码

tpc.org 官网下载信息时,需要填写相关的用户信息,可随便填写,不会校验,但是需要通过邮箱接收下载链接,同时需要 Google reCAPTCHA 校验,不过国内可能无法访问导致下载失败,此时可以通过浏览器的 Header Editor 设置。

从浏览器的插件库中安装,打开配置页面,选择 EXPORT OR IMPORT 导入,其中 URL 填写 https://azurezeng.github.io/static/HE-GoogleRedirect.json 链接,也可以从 本地 下载。

生成数据

dbgen/makefile.suite 复制为 Makefile 然后修改如下内容。

CC      =  gcc
DATABASE=  MYSQL
MACHINE = LINUX
WORKLOAD = TPCH

然后修改 tpcd.h 头文件,增加如下内容。

#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

然后通过 make 编译即可,然后就可以直接使用命令行生成数据了。

命令行参数

常用的命令行参数有:

  • -f 覆盖存在文件。
  • -s <n> 数据规模,其中 SF=1 对应 1GB 是 Scale Factor 简写,可以是浮点数,例如 0.01 生成 10M 数据。
  • -T <c> 只生成指定的数据集,可以通过 -h 查看帮助文档。

其中 partsupporderslineitem 的数据量比较大,可以分批并发生成,通过 -C 指定分多少批,以及 -S 指定是第几批。例如,可以通过如下脚本并发生成。

echo "Begin to generate data for table: lineitem"
for i in $(seq 1 "${PARALLEL}"); do
    {
        "${TPCH_DBGEN_DIR}/dbgen" -f -s "${SCALE_FACTOR}" -T L -C "${PARALLEL}" -S "${i}"
    } &
done

生成的数据有两个绑定关系,分别是 Order+LineItem 以及 Part+Supplier 两个,会同时生成对应数据。

另外,通过 -U 可以生成更新,只对应了 orderslineitem 两个表,还有一个是 delete 暂不清楚作用,通过 -h 参数可以看到一个简单的生成示例。

数据导入

不同系统的建表语句或者导入方式略有区别,这里简单整理。

查询的 SQL 可以参考源码中的 dbgen/queries 目录,可以通过 qgen 命令生成,Query 是一个已经生成查询语句。

表结构

对应的 Schema 如下。

tpch schema

这是典型的雪花模型,总计 8 张表,其中 Nation 和 Region 数据量固定,其余的表数据量根比例因子相关。

Scale Factor, SF 比例因子,可以指定为 1、100、1000 等,基本对应了总的数据量,分别为 1GB、100GB、1TB 等,上述的表结构中同时包含表的实际行数根据 SF 的变化。

这 8 张表的说明如下:

  • part 零件信息
  • lineitem 在售商品信息

整个库中保存了 [1992, 1998] 总计 7 年的数据,有些 SQL 会计算平均每年的信息,例如 Q17 中。

SQL

Q2 最小价格供货商

在指定的供货区 (Region) 内,对于满足指定条件 (某类、大小) 的货物,哪个供货商能以最低的价格供应。

特点:带有排序、聚集操作、子查询并存的多表查询操作,结果只返回前 100 行。

Q17 小订单收入查询

对于某个指定品牌和包装类型的零件,

对于某个指定品牌和包装类型的零件,会有多个供货商,甚至相同供货商不同时间的价格、供货量也有所区别,

获取比平均供货量的百分之二十还低的小批量订单。

对于m

源码解析

生成数据会以 NATION 作为边界,以下会同时乘以 Scale Factor 系数,以上则只包含对应记录数。这里的 nation 和 region 信息通过 dist.dss 文件读取,其 weight 就是对应的 key 了。

tdef 定义的了表生成信息,例如默认行数、打印函数、种子函数等。

参考

可以从 tpc.org 中查看相关的信息,包括对应的 标准文档