用 TPCH 练习性能优化
一、 数据准备
利用TPCH官方工具生成文本文件形式的原始数据,共8个表,数据量总规模100G,各文件大小见后表。
然后根据这些文本文件生成SPL的二进制文件,每个表对应一个二进制文件。
组表有一些索引信息,总会有一个最低的空间占用,不适合存储小数据表。因此这里小数据表采用行式的集文件,以减少存储量,计算时全部读入。大数据表使用列式的组表,并以主键作为维,在转存时要用sortx()排序。
1.1 region/nation
生成集成文件,以region表为例:
A |
|
1 |
=file("region.tbl").import(; , "|").new(_1:R_REGIONKEY, _2:R_NAME, _3:R_COMMENT).sort(R_REGIONKEY) |
2 |
=file("region.btx").export@b(A1) |
集文件不需要显式创建数据结构,直接写出数据即可。
1.2 customer/supplier/part/orders
生成组表,以customer表为例:
A |
|
1 |
=file("customer.tbl").cursor(; , "|").new(_1:C_CUSTKEY, _2:C_NAME, _3:C_ADDRESS, _4:C_NATIONKEY, _5:C_PHONE, _6:C_ACCTBAL, _7:C_MKTSEGMENT, _8:C_COMMENT).sortx(C_CUSTKEY;15000000) |
2 |
=file("customer.ctx").create(#C_CUSTKEY, C_NAME, C_ADDRESS, C_NATIONKEY, C_PHONE, C_ACCTBAL, C_MKTSEGMENT, C_COMMENT) |
3 |
>A2.append(A1) |
组表创建时要列出数据结构并指明主键字段(前面加#),数据要按主键排序。sortx的第二个参数可根据内存大小来确定,省略不写也能工作。
1.3 partsupp/lineitem
partsupp和lineitem分别是part和orders的子表。要保证子表和主表同步分段,创建组表时要用@p选项,以lineitem表为例:
A |
|
1 |
=file("lineitem.tbl").cursor(; , "|").new(_1:L_ORDERKEY, _4:L_LINENUMBER, _2:L_PARTKEY, _3:L_SUPPKEY, _5:L_QUANTITY, _6:L_EXTENDEDPRICE,_7:L_DISCOUNT, _8:L_TAX, _9:L_RETURNFLAG, _10:L_LINESTATUS,_11:L_SHIPDATE, _12:L_COMMITDATE, _13:L_RECEIPTDATE,_14:L_SHIPINSTRUCT, _15:L_SHIPMODE, _16:L_COMMENT).sortx(L_ORDERKEY,L_LINENUMBER;4000000) |
2 |
=file("lineitem.ctx").create@p(#L_ORDERKEY,#L_LINENUMBER,L_PARTKEY, L_SUPPKEY, L_QUANTITY, L_EXTENDEDPRICE,L_DISCOUNT, L_TAX, L_RETURNFLAG, L_LINESTATUS, L_SHIPDATE, L_COMMITDATE, L_RECEIPTDATE,L_SHIPINSTRUCT, L_SHIPMODE, L_COMMENT) |
3 |
>A2.append(A1) |
A2中使用了@p,会确保在数据分段时不会把L_ORDERKEY相同的记录分到两段,以获得正确的并行计算结果。
二、 数据文件大小
原始文件大小、SPL文件大小见下表。
数据表名 |
数据行数 |
tbl大小 |
ctx/btx大小 |
region |
5 |
1K |
8K |
nation |
25 |
2K |
10K |
customer |
1500万 |
2.4G |
1.3G |
part |
2000万 |
2.4G |
1.0G |
supplier |
100万 |
140M |
0.1G |
partsupp |
8000万 |
12.2G |
4.9G |
orders |
1.5亿 |
17.8G |
7.2G |
lineitem |
6亿 |
79.5G |
29.4G |
三、 TPCH练习详细解析
附:早期版本 从 TPCH 测试学习性能优化技巧
英文版