当数据库达到一定的成熟度,向大客户推广时,必定会被要求跑 TPC-H,特别是当你标称为 HTAP 数据库时。
跑 TPC-H 就需要对 TPC-H 的一些基本要求有一个大致了解,最核心的两组概念是:
本文基于 TPC-H 规范文档,并结合 dbgen 实验结果来介绍 RF1、RF2 的核心知识点。
query 以及 refresh function 的概念定义如下:
power test、throughput test 的概念如下:
每一轮 Refresh Function,需要更新 ORDERS、LINEITEM 表 0.1% 的行。也就是说,对于 SF=100 的情况需要更新 600,000,000/1000 = 60w 行(SF与行数关系参考我的这篇文章)
每一轮 Refresh Function 中涉及到的事务个数不作任何限制,也就是说,可以所有数据在一个事务里里更新完,也可以每一组数据对应一个小事务。总体原则是:
要满足业务层的一致性。从 ORDER 表里删除一个订单时, LINEITEM 中对应的数据也要在一个事务里删掉。
所以,这就对我们提出了一个挑战:通过外部工具直接更新 LINEITEM、ORDER 表,就要求外部工具满足这个事务特性。像 LOAD DATA 这种工具就无法完成这个任务,它无法保证事务性。
可以使用任何语言,包括 SQL,Python 脚本等等。
Refresh Function 1 实现的功能是向系统中新增订单。每个订单向 ORDERS 表中插入一行,同时向 LINEITEM 表插入 1 到 7 行,表示每个订单包含 1 到 7 种商品。
但是 RF1 并不要求用户真的实现这样一个 LOOP。一次性把要插入的数据准备好后一次性 LOAD 到系统中,也是允许的。这里的例子只是说明插入的数据需要遵循什么样的数据规范。
Refresh Function 负责模拟删除订单。从 dbgen 的生成结果看,它只生成了 delete.1 这个文件,这个文件里的每一行会用于删除 ORDERS 表和 LINEITEMS 表。所以一般要求在 L_ORDERKEY 上建立索引,不然性能惨不忍睹。
要插入的数据必须通过 dbgen 来生成,举个例子:
./dbgen -s 100 -U 1 -S 1
输出如下:
[raywill@>/tpch/gen_data/test]
$ll
total 93008
-rwxr-xr-x 1 raywill users 111862 May 6 16:22 dbgen
-rwxr-xr-x 1 raywill users 11815 May 6 12:01 dists.dss
-rw-r--r-- 1 raywill users 77773330 May 6 16:22 lineitem.tbl.u1
-rw-r--r-- 1 raywill users 17334921 May 6 16:22 orders.tbl.u1
[raywill@>/tpch/gen_data/test]
$./dbgen -s 100 -U 1 -v
TPC-H Population Generator (Version 2.17.0)
Copyright Transaction Processing Performance Council 1994 - 2010
Generating update pair #1 for orders/lineitem tables/
Preloading text ... 100%
done.
[raywill@>/tpch/gen_data/test]
$ll
total 94156
-rwxr-xr-x 1 raywill users 111862 May 6 16:22 dbgen
-rw-r--r-- 1 raywill users 1172209 May 6 16:23 delete.1
-rwxr-xr-x 1 raywill users 11815 May 6 12:01 dists.dss
-rw-r--r-- 1 raywill users 77773330 May 6 16:23 lineitem.tbl.u1
-rw-r--r-- 1 raywill users 17334921 May 6 16:23 orders.tbl.u1
[raywill@>/tpch/gen_data/test]
$wc -l delete.1 orders.tbl.u1 lineitem.tbl.u1
150000 delete.1
150000 orders.tbl.u1
599976 lineitem.tbl.u1
899976 total
如果希望生成多个文件,修改 -U 参数即可,例如:
[raywill@>/tpch/gen_data/test]
$./dbgen -s 100 -U 3 -v
TPC-H Population Generator (Version 2.17.0)
Copyright Transaction Processing Performance Council 1994 - 2010
Generating update pair #1 for orders/lineitem tables/
Preloading text ... 100%
done.
Generating update pair #2 for orders/lineitem tablesdone.
Generating update pair #3 for orders/lineitem tablesdone.
[raywill@>/tpch/gen_data/test]
$ll
total 283752
-rwxr-xr-x 1 raywill users 111862 May 6 16:22 dbgen
-rw-r--r-- 1 raywill users 1172209 May 6 16:32 delete.1
-rw-r--r-- 1 raywill users 1250001 May 6 16:32 delete.2
-rw-r--r-- 1 raywill users 1350000 May 6 16:32 delete.3
-rwxr-xr-x 1 raywill users 11815 May 6 12:01 dists.dss
-rw-r--r-- 1 raywill users 77773330 May 6 16:32 lineitem.tbl.u1
-rw-r--r-- 1 raywill users 78038149 May 6 16:32 lineitem.tbl.u2
-rw-r--r-- 1 raywill users 78567787 May 6 16:32 lineitem.tbl.u3
-rw-r--r-- 1 raywill users 17334921 May 6 16:32 orders.tbl.u1
-rw-r--r-- 1 raywill users 17410558 May 6 16:32 orders.tbl.u2
-rw-r--r-- 1 raywill users 17517475 May 6 16:32 orders.tbl.u3
[raywill@>/tpch/gen_data/test]
$wc -l delete.* lineitem.* lineitem.*
150000 delete.1
150000 delete.2
150000 delete.3
599976 lineitem.tbl.u1
599805 lineitem.tbl.u2
600680 lineitem.tbl.u3
599976 lineitem.tbl.u1
599805 lineitem.tbl.u2
600680 lineitem.tbl.u3
如果你的数据库不支持大事务,需要分个事务删订单,需要分多次创建订单,怎么办呢?对于这一点,dbgen 已经为你考虑好了,它提供了两个选项
./dbgen -s 100 -U 3 -d 3 -i 3
$wc -l *.u*
50001 delete.u1.1
50001 delete.u1.2
49998 delete.u1.3
50001 delete.u2.1
50001 delete.u2.2
49998 delete.u2.3
50001 delete.u3.1
50001 delete.u3.2
49998 delete.u3.3
200360 lineitem.tbl.u1.1
199382 lineitem.tbl.u1.2
200234 lineitem.tbl.u1.3
200016 lineitem.tbl.u2.1
199331 lineitem.tbl.u2.2
200458 lineitem.tbl.u2.3
199413 lineitem.tbl.u3.1
201019 lineitem.tbl.u3.2
200248 lineitem.tbl.u3.3
50000 orders.tbl.u1.1
50000 orders.tbl.u1.2
50000 orders.tbl.u1.3
50000 orders.tbl.u2.1
50000 orders.tbl.u2.2
50000 orders.tbl.u2.3
50000 orders.tbl.u3.1
50000 orders.tbl.u3.2
50000 orders.tbl.u3.3
2700461 total
每次处理编号对应的文件数据,即可保证 tpch 要求的事务约束。
更多内容,见 dbgen 帮助:
$./dbgen --help
./dbgen: invalid option -- '-'
ERROR: option '-' unknown.
TPC-H Population Generator (Version 2.17.0 build 0)
Copyright Transaction Processing Performance Council 1994 - 2010
USAGE:
dbgen [-{vf}][-T {pcsoPSOL}]
[-s <scale>][-C <procs>][-S <step>]
dbgen [-v] [-O m] [-s <scale>] [-U <updates>]
Basic Options
===========================
-C <n> -- separate data set into <n> chunks (requires -S, default: 1)
-f -- force. Overwrite existing files
-h -- display this message
-q -- enable QUIET mode
-s <n> -- set Scale Factor (SF) to <n> (default: 1)
-S <n> -- build the <n>th step of the data/update set (used with -C or -U)
-U <n> -- generate <n> update sets
-v -- enable VERBOSE mode
Advanced Options
===========================
-b <s> -- load distributions for <s> (default: dists.dss)
-d <n> -- split deletes between <n> files (requires -U)
-i <n> -- split inserts between <n> files (requires -U)
-T c -- generate cutomers ONLY
-T l -- generate nation/region ONLY
-T L -- generate lineitem ONLY
-T n -- generate nation ONLY
-T o -- generate orders/lineitem ONLY
-T O -- generate orders ONLY
-T p -- generate parts/partsupp ONLY
-T P -- generate parts ONLY
-T r -- generate region ONLY
-T s -- generate suppliers ONLY
-T S -- generate partsupp ONLY
To generate the SF=1 (1GB), validation database population, use:
dbgen -vf -s 1
To generate updates for a SF=1 (1GB), use:
dbgen -v -U 1 -s 1
[xiaochu.yh@/tpch_10m_data]
$cat query.sql
LOAD DATA INFILE '/tpch_10m_data/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';
LOAD DATA INFILE '/tpch_10m_data/orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|';
[xiaochu.yh@/tpch_10m_data]
$cat rf.sql
LOAD DATA INFILE '/tpch_10m_data/delete.1' INTO TABLE delete_orders FIELDS TERMINATED BY '|';
LOAD DATA INFILE '/tpch_10m_data/orders.tbl.u1' INTO TABLE add_orders FIELDS TERMINATED BY '|';
LOAD DATA INFILE '/tpch_10m_data/lineitem.tbl.u1' INTO TABLE add_lineitem FIELDS TERMINATED BY '|';
--insert data
begin;
insert into lineitem select * from add_lineitem;
insert into orders select * from add_orders;
commit;
-- remove data
begin;
delete from lineitem where l_orderkey in (select o_orderkey from delete_orders);
delete from orders where o_orderkey in (select o_orderkey from delete_orders);
commit;
一轮 power test 首先要执行一次 RF 1 新增订单,然后做查询,然后执行一次 RF2 删除一批订单。
关于 Refresh Function,了解到这么多,基本就有一个大体概念。总结一下,要点包括:
http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-h_v2.17.1.pdf
system under test (SUT)
scale factor (SF)
如果你对这部分内容感兴趣,欢迎微信联系:hustos