TPC-H Refresh Function 规范分析

当数据库达到一定的成熟度,向大客户推广时,必定会被要求跑 TPC-H,特别是当你标称为 HTAP 数据库时。

跑 TPC-H 就需要对 TPC-H 的一些基本要求有一个大致了解,最核心的两组概念是:

  • Query:Power Run, ThroughPut Run
  • Modify: RF1, RF2

本文基于 TPC-H 规范文档,并结合 dbgen 实验结果来介绍 RF1、RF2 的核心知识点。

基本概念

query 以及 refresh function 的概念定义如下:
5.1.2

power test、throughput test 的概念如下:
在这里插入图片描述

刷新比例

2.5.1
每一轮 Refresh Function,需要更新 ORDERS、LINEITEM 表 0.1% 的行。也就是说,对于 SF=100 的情况需要更新 600,000,000/1000 = 60w 行(SF与行数关系参考我的这篇文章

事务要求

2.5.2
每一轮 Refresh Function 中涉及到的事务个数不作任何限制,也就是说,可以所有数据在一个事务里里更新完,也可以每一组数据对应一个小事务。总体原则是:
要满足业务层的一致性。从 ORDER 表里删除一个订单时, LINEITEM 中对应的数据也要在一个事务里删掉。

所以,这就对我们提出了一个挑战:通过外部工具直接更新 LINEITEM、ORDER 表,就要求外部工具满足这个事务特性。像 LOAD DATA 这种工具就无法完成这个任务,它无法保证事务性。

Refresh Function 实现

2.5.3
可以使用任何语言,包括 SQL,Python 脚本等等。

Refresh Function 1

在这里插入图片描述在这里插入图片描述
Refresh Function 1 实现的功能是向系统中新增订单。每个订单向 ORDERS 表中插入一行,同时向 LINEITEM 表插入 1 到 7 行,表示每个订单包含 1 到 7 种商品。

但是 RF1 并不要求用户真的实现这样一个 LOOP。一次性把要插入的数据准备好后一次性 LOAD 到系统中,也是允许的。这里的例子只是说明插入的数据需要遵循什么样的数据规范。

Refresh Function 2

2.7
Refresh Function 负责模拟删除订单。从 dbgen 的生成结果看,它只生成了 delete.1 这个文件,这个文件里的每一行会用于删除 ORDERS 表和 LINEITEMS 表。所以一般要求在 L_ORDERKEY 上建立索引,不然性能惨不忍睹。

DBGen

要插入的数据必须通过 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 已经为你考虑好了,它提供了两个选项

./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 规范

在这里插入图片描述
一轮 power test 首先要执行一次 RF 1 新增订单,然后做查询,然后执行一次 RF2 删除一批订单。

总结

关于 Refresh Function,了解到这么多,基本就有一个大体概念。总结一下,要点包括:

  • 更新的表
  • 更新的行数
  • 事务要求
  • 更新的模式,即 RF1负责新增,RF2负责删除

附录

规范文档

http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-h_v2.17.1.pdf

缩写

system under test (SUT)
scale factor (SF)

contact

如果你对这部分内容感兴趣,欢迎微信联系:hustos

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值