其他
性能优化技巧:大事实表与大维表关联
1. Oracle测试
select /*+ parallel(4) */
state,
sum(amount) as amount
from
account,
trade
where
outid = accountid
and tradedate >= date '2008-01-01' + interval '1500' day(4)
group by
state
order by
state;
其中/*+ parallel(4) */ 表示4个并行。
2. SPL测试
A | |
1 | =now() |
2 | =elapse(date("2008-01-01"),1500) |
3 | =file(path+"account.ctx").open() |
4 | =file(path+"trade.ctx").open().cursor@m(outid,amount;tradedate>=A2;4) |
5 | =A4.joinx@u(outid,A3:accountid,state;4000000) |
6 | =A5.groups(state;sum(amount):amount) |
7 | =interval@s(A1,now()) |
joinx时加选项@u就适用于大事实表与大维表关联,它的最后一个参数指明把游标拆分为多路时,每次从游标中读取的记录数,在内存能装下的情况下,此值越大性能越高。
3. 测试结果及分析
事实表过滤后记录数 | 10亿 | 12亿 | 14亿 | 15亿 | 16亿 |
Oracle | 730 | 802 | 860 | 894 | >10小时 |
SPL | 486 | 562 | 643 | 681 | 730 |
经测算,10亿行数据正常情况会超过8G内存,优秀的Oracle可能采用了数据压缩技术,致使能装下15亿行数据。但是在16亿行数据时,内存就怎么也放不下了,开始发生大量占用swap区的现象,也造成运行速度奇慢,测试中等了11小时也没查询出来,只好终止了。而SPL这种单边技术,不受数据量大小的限制,本来就是面向外存设计,而且一次分堆就能解决,时间基本上呈线性增加。
1. 单维表
A | |
1 | =now() |
2 | =elapse(date("2008-01-01"),1500) |
3 | =file(path+"account.ctx").open() |
4 | =file(path+"trade.ctx").open().cursor@m(outid,receiveid,amount;tradedate>=A2;4) |
5 | =A4.joinx@u(outid,A3:accountid,state;4000000) |
6 | =A5.groups(state;sum(amount):amount) |
7 | =interval@s(A1,now()) |
A | |
1 | =now() |
2 | =elapse(date("2008-01-01"),1500) |
3 | =file(path+"account.ctx").open() |
4 | =file(path+"trade.ctx").open().cursor@m(outid,receiveid,amount;tradedate>=A2;4) |
5 | =A4.joinx@u(outid,A3:accountid,state:out_state;receiveid,A3:accountid,state:receive_state;4000000) |
6 | =A5.groups(out_state;sum(amount):amount) |
7 | =interval@s(A1,now()) |
3. 测试结果及分析
事实表过滤后记录数 | 10亿 | 12亿 | 14亿 | 16亿 |
单维表 | 500 | 614 | 664 | 782 |
双维表 | 1146 | 1375 | 1501 | 1957 |
双维表比单维表多了一倍的关联计算量,运算时间也仅仅略多于一倍,也是呈线性增加的,不会发生完全不可控的局面。
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^