其他
性能优化技巧:前半有序时的排序
1. Oracle测试
select area, salesman from salesman1 order by area, salesman
本来只需这一句简单的SQL即可,不过这个排序结果的输出时间却非常长,为了减少输出量,只统计排序过程的用时,我们不输出排序后的全部结果,而只输出中间位置的一行,也就是行号为2亿的那一行,所以SQL语句改写如下:
select area, salesman from (
select area, salesman, rownum rn from (
select area, salesman from salesman1 order by area, salesman
)
) where rn=200000000;
要多说一句,这个查询其实没有什么业务意义,纯粹是为了迫使数据库大排序且避免统计输出时间的 。
2. SPL测试
A | |
1 | =now() |
2 | =file("/home/ctx/salesman1.ctx").open().cursor(area,salesman) |
3 | =A2.group@qs(area;salesman) |
4 | =A3.skip(199999999) |
5 | =A3.fetch(1) |
6 | =interval@s(A1,now()) |
group@qs中选项s表示对数据集只排序,不分组;选项q表示数据集对分号前的分组表达式(area)是有序的,请求使用前半有序时的排序方法按分号后的表达式(salesman)排序。
1. Oracle测试
select area, salesman from (
select area, salesman, rownum rn from (
select area, salesman from salesman2 order by area, salesman
)
) where rn=1000000000;
输出行号为10亿的一行。
2. SPL测试
A | |
1 | =now() |
2 | =file("/home/ctx/salesman2.ctx").open().cursor(area,salesman) |
3 | =A2.group@qs(area;salesman) |
4 | =A3.skip(999999999) |
5 | =A3.fetch(1) |
6 | =interval@s(A1,now()) |
数据量 | 4亿行 | 20亿行 | |
Oracle | 326 | 2556 | |
SPL | 186 | 1266 |
从测试结果看,SPL前半有序排序与Oracle的大排序相比,数据量4亿行时,运行时间只有60%,20亿行时只有50%,可见性能提升很多,数据量越大时效果越显著。
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^