其他
性能优化技巧:有序分组
1. Oracle测试
select /*+ parallel(n) */
orderid, sum(amount) as amount, count(detailid) as details
from orderdetail_1
group by orderid;
其中/*+ parallel(n) */ 用于并行测试,n为并行数。
2. SPL测试
A | |
1 | =now() |
2 | =file("/home/ctx/orderdetail_1.ctx").open().cursor@m(orderid,detailid,amount;;1) |
3 | =A2.groups@o(orderid;sum(amount):amount,count(detailid):details) |
4 | =interval@s(A1,now()) |
groups分组时加选项@o就适用分组字段有序时,只比较相邻行的值进行有序分组。
3. 测试结果
并行数 | 1 | 2 | 4 | 8 | 16 |
Oracle | 24 | 19 | 16 | 13 | 13 |
SPL | 11 | 6 | 3 | 2 | 1 |
在8千万行数据的情况下,SPL有序分组的性能提高了一倍左右,并且并行的效果非常好,性能呈线性上升。而使用hash分组的Oracle并行提速效果并不明显。
1. Oracle测试
select * from (
select /*+ parallel(n) */
orderid, sum(amount) sum_amount, count(detailid) as details
from orderdetail_2
group by orderid
)
where sum_amount<35;
其中/*+ parallel(n) */ 用于并行测试,n为并行数。
2. SPL测试
A | |
1 | =now() |
2 | =file("/home/ctx/orderdetail_2.ctx").open().cursor@m(orderid,detailid,amount;;1) |
3 | =A2.group(orderid;sum(amount):amount,count(detailid):details).select(amount<35).fetch() |
4 | =interval@s(A1,now()) |
由于分组结果集很大,无法全部装载到内存,所以使用group函数进行有序分组,返回分组结果集对应的游标,再对游标过滤后取得需要的查询结果。
3. 测试结果
并行数 | 1 | 2 | 4 | 8 | 16 |
Oracle | 2647 | 1345 | 1092 | 806 | 737 |
SPL | 451 | 235 | 119 | 65 | 48 |
在不并行的情况下,SPL有序分组比Oracle性能提升了近6倍左右。因SPL有序分组方法很适合并行,随着并行数的增加,性能提升的效果就越好。
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^