性能优化技巧:前半有序时的排序

一、  问题背景与适用场景

在对数据集进行排序运算时,有时会遇到这样一种场景:数据集T已经按字段a有序,而字段b无序,现在我们要将Tab排序,我们称之为前半有序(a有序)的排序。此时我们能想到一种优化的排序方法:从T中先取出a值相同的一组记录,再这一组内对b排序。然后再依次取出下一组a值相同的记录,重复这个动作,直到完成T中所有记录的排序。这种方法的好处是不需要对T中所有记录进行大排序,一次只需取出一小组,对内存容量要求大大减低,只需能装下每个小组即可。

遗憾的是SQL并不支持这种优化算法,只能所有记录进行大排序,而SPL提供了对这种算法的支持,下面我们实例测试一下,并与Oracle作对比。

 

二、  测试环境与任务

测试机有两个Intel2670 CPU,主频2.6G,共16核,内存64GSSD固态硬盘。在此机上安装虚拟机来测试,设置虚拟机为16核、8G内存。

在虚拟机上创建数据表salesman1,共两个字段:area(字符串)salesman(字符串),生成数据记录4亿行,按area升序排列,area不同值共2000个,每个area对应salesman20万个。将此表数据导入Oracle数据库,同时用它生成集算器SPL组表来进行测试。

再建另一张表salesman2作大数据量测试,数据表结构不变,总数据记录20亿行,area4000个,每个area对应50万个salesman

测试任务都是要对表按照areasalesman排序。

 

三、  小数据量测试

1.  Oracle测试

编写测试SQL如下:

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测试

编写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测试

编写测试SQL如下:

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测试

编写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%,可见性能提升很多,数据量越大时效果越显著。

 

 


系列性能优化技巧:
性能优化技巧:遍历复用
性能优化技巧:TopN
性能优化技巧:预关联
性能优化技巧:部分预关联
性能优化技巧:外键序号化
性能优化技巧:维表过滤或计算时的关联
性能优化技巧:有序归并
性能优化技巧:有序定位关联提速主子关联后的过滤
性能优化技巧:附表
性能优化技巧:大维表查找
性能优化技巧:单边分堆
性能优化技巧:有序分组
性能优化技巧:后半有序分组
性能优化技巧:前半有序时的排序

以下是广告时间

对润乾产品感兴趣的小伙伴,一定要知道软件还能这样卖哟性价比还不过瘾? 欢迎加入好多乾计划。
这里可以低价购买软件产品,让已经亲民的价格更加便宜!
这里可以销售产品获取佣金,赚满钱包成为土豪不再是梦!
这里还可以推荐分享抢红包,每次都是好几块钱的巨款哟!
来吧,现在就加入,拿起手机扫码,开始乾包之旅



嗯,还不太了解好多乾?
猛戳这里
玩转好多乾