一、 问题背景与实用场景
在对数据集进行排序运算时,有时会遇到这样一种场景:数据集T曾经按字段a有序,而字段b无序,当初咱们要将T按a、b排序,咱们称之为前半有序(a有序)的排序。此时咱们能想到一种优化的排序办法:从T中先取出a值雷同的一组记录,再这一组内对b排序。而后再顺次取出下一组a值雷同的记录,反复这个动作,直到实现T中所有记录的排序。这种办法的益处是不须要对T中所有记录进行大排序,一次只需取出一小组,对内存容量要求大大减低,只需能装下每个小组即可。
遗憾的是SQL并不反对这种优化算法,只能所有记录进行大排序,而SPL提供了对这种算法的反对,上面咱们实例测试一下,并与Oracle作比照。
二、 测试环境与工作
测试机有两个Intel2670 CPU,主频2.6G,共16核,内存64G,SSD固态硬盘。在此机上安装虚拟机来测试,设置虚拟机为16核、8G内存。
在虚拟机上创立数据表salesman1,共两个字段:area(字符串)、salesman(字符串),生成数据记录4亿行,按area升序排列,area不同值共2000个,每个area对应salesman为20万个。将此表数据导入Oracle数据库,同时用它生成集算器SPL组表来进行测试。
再建另一张表salesman2作大数据量测试,数据表构造不变,总数据记录20亿行,area值4000个,每个area对应50万个salesman。
测试工作都是要对表依照area、salesman排序。
三、 小数据量测试
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脚本如下:
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脚本如下:
五、 测试后果
测试后果如下,单位(秒):
从测试后果看,SPL前半有序排序与Oracle的大排序相比,数据量4亿行时,运行工夫只有60%,20亿行时只有50%,可见性能晋升很多,数据量越大时成果越显著。