乐趣区

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

一、问题背景与实用场景

在对数据集进行排序运算时,有时会遇到这样一种场景:数据集 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%,可见性能晋升很多,数据量越大时成果越显著。

退出移动版