其他
性能优化技巧:外键序号化
1)新建一个键值-序号对应表,保存维表的键值和自然序号的对应关系;
2)把维表的键值替换为自然序号,得到一个新的维表文件;
1. supplier序号化
A | |
1 | =file("/home/tbl/supplier.tbl").cursor(;,"|").new(_1:S_SUPPKEY, _2:S_NAME, _3:S_ADDRESS, _4:S_NATIONKEY, _5:S_PHONE, _6:S_ACCTBAL).fetch().derive(#:xh) |
2 | =file("/home/btx/supplier_xh_key.btx").export@b(A1,S_SUPPKEY,xh) |
3 | =A1.new(xh:S_SUPPKEY, S_NAME, S_ADDRESS, S_NATIONKEY, S_PHONE, S_ACCTBAL) |
4 | =file("/home/ctx/supplier_xh.ctx").create(#S_SUPPKEY, S_NAME, S_ADDRESS, S_NATIONKEY, S_PHONE, S_ACCTBAL) |
5 | >A4.append(A3.cursor()) |
A1 从原始数据文件supplier.tbl中读出数据,并用derive函数新增加一列xh,用行号作为字段值
2. part序号化
A | |
1 | =file("/home/tbl/part.tbl").cursor(;,"|").new(_1:P_PARTKEY, _2:P_NAME, _3:P_MFGR, _4:P_BRAND, _5:P_TYPE, _6:P_SIZE, _7:P_CONTAINER, _8:P_RETAILPRICE).fetch().derive(#:xh) |
2 | =file("/home/btx/part_xh_key.btx").export@b(A1,P_PARTKEY,xh) |
3 | =A1.new(xh:P_PARTKEY, P_NAME,P_MFGR, P_BRAND, P_TYPE, P_SIZE, P_CONTAINER, P_RETAILPRICE) |
4 | =file("/home/ctx/part_xh.ctx").create(#P_PARTKEY, P_NAME,P_MFGR, P_BRAND, P_TYPE, P_SIZE, P_CONTAINER, P_RETAILPRICE) |
5 | >A4.append(A3.cursor()) |
脚本原理与supplier表序号化相同,生成的键值与序号对应关系表为part_xh_key.btx,序号化后的组表文件叫part_xh.ctx。
3. orders序号化
A | |
1 | =file("/home/tbl/orders.tbl").cursor(;,"|").new(_1:O_ORDERKEY, _2:O_CUSTKEY, _3:O_ORDERSTATUS,_4:O_TOTALPRICE,_5:O_ORDERDATE, _6:O_ORDERPRIORITY,_7:O_SHIPPRIORITY).fetch().derive(#:xh) |
2 | =file("/home/btx/orders_xh_key.btx").export@b(A1,O_ORDERKEY,xh) |
3 | =A1.new(xh:O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE, O_ORDERDATE,O_ORDERPRIORITY,O_SHIPPRIORITY) |
4 | =file("/home/ctx/orders_xh.ctx").create(#O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE,O_ORDERDATE,O_ORDERPRIORITY,O_SHIPPRIORITY) |
5 | >A4.append(A3.cursor()) |
脚本原理与supplier表序号化相同,生成的键值与序号对应关系表为orders_xh_key.btx,序号化后的组表文件叫orders_xh.ctx。
4. lineitem序号化
A | |
1 | =file("/home/tbl/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) |
2 | =file("/home/btx/orders_xh_key.btx").import@b() |
3 | =file("/home/btx/part_xh_key.btx").import@b() |
4 | =file("/home/btx/supplier_xh_key.btx").import@b() |
5 | =A1.switch(L_ORDERKEY,A2:O_ORDERKEY;L_PARTKEY,A3:P_PARTKEY;L_SUPPKEY,A4:S_SUPPKEY) |
6 | =A5.run(L_ORDERKEY=L_ORDERKEY.xh, L_PARTKEY=L_PARTKEY.xh, L_SUPPKEY=L_SUPPKEY.xh) |
7 | =file("/home/ctx/lineitem_xh.ctx").create(#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;L_ORDERKEY) |
8 | >A7.append(A6) |
A1 创建读入lineitem原始数据的游标
1. 原始数据测试
A | |
1 | >env(supplier,file("/home/ctx/supplier.ctx").open().memory().keys@i(S_SUPPKEY)) |
2 | >env(part,file("/home/ctx/part.ctx").open().memory().keys@i(P_PARTKEY)) |
3 | >env(orders,file("/home/ctx/orders.ctx").open().memory().keys@i(O_ORDERKEY)) |
加载维表并建索引。
A | |
1 | =file("/home/ctx/lineitem.ctx").open().cursor(L_ORDERKEY,L_PARTKEY, L_SUPPKEY,L_EXTENDEDPRICE,L_DISCOUNT,L_SHIPDATE) |
2 | =A1.switch(L_ORDERKEY,orders;L_PARTKEY,part;L_SUPPKEY,supplier) |
3 | =A2.select(L_ORDERKEY.O_TOTALPRICE>0 && L_PARTKEY.P_SIZE>0 && L_SUPPKEY.S_ACCTBAL<999999) |
4 | =A3.groups(year(L_SHIPDATE):l_year; sum(L_EXTENDEDPRICE*(1-L_DISCOUNT)):revenue) |
先运行维表预加载脚本,再运行测试脚本,得到测试脚本运行时间为450秒。
2. 序号化数据测试
A | |
1 | >env(supplier,file("/home/ctx/supplier_xh.ctx").open().memory()) |
2 | >env(part,file("/home/ctx/part_xh.ctx").open().memory()) |
3 | >env(orders,file("/home/ctx/orders_xh.ctx").open().memory()) |
加载的是序号化后的维表,不需要建立索引。
A | |
1 | =file("/home/ctx/lineitem_xh.ctx").open().cursor(L_ORDERKEY,L_PARTKEY, L_SUPPKEY,L_EXTENDEDPRICE,L_DISCOUNT,L_SHIPDATE) |
2 | =A1.switch(L_ORDERKEY,orders:#;L_PARTKEY,part:#;L_SUPPKEY,supplier:#) |
3 | =A2.select(L_ORDERKEY.O_TOTALPRICE>0 && L_PARTKEY.P_SIZE>0 && L_SUPPKEY.S_ACCTBAL<999999) |
4 | =A3.groups(year(L_SHIPDATE):l_year; sum(L_EXTENDEDPRICE*(1-L_DISCOUNT)):revenue) |
注意:A2中关联时使用“:#”与维表关联,表示用事实表中的键值与维表的行号进行关联,假如键值是7,则直接与维表的第7行关联。
3. 分析与结论
1. 维表与事实表均有新增数据
1)先取得维表新增加的记录,追加键值与序号对应关系表;
2)再把新增记录追加到序号化后的维表,追加时依据键值与序号对应关系表;
2. 仅事实表有新增数据
更多性能优化技巧,可在底部“阅读原文”中查看
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^