性能优化技巧:后半有序分组

一、  问题背景与适用场景什么是后半有序?如果数据集T已经按字段a、b有序,现在我们要将T按b排序或分组时,因为在a值相同的段内,b都是有序的,这种要排序或分组的字段在分段内有序的情况就称为后半有序。我们知道,快速排序算法的原理就是一种递归的分段排序再归并的算法,对于后半有序这样的已经大体有序的数组,快速排序的速度已经能够很快。所以如果采用快速排序算法对T按b排序后,就可以使用《性能优化技巧:有序分组》中介绍的优化原理进行分组了。SPL提供了后半有序分组方法,我们实例测试一下,并且与SPL和Oracle的hash分组算法作对比。二、  测试环境与任务测试机有两个Intel2670 CPU,主频2.6G,共16核,内存64G,SSD固态硬盘。在此机上安装虚拟机来测试,设置虚拟机为16核、8G内存。在虚拟机上创建数据表sales,共四个字段:orderdate、area(字符串)、salesman(字符串)、amount(实数),生成数据记录10亿行。将此表数据导入Oracle数据库,同时用它生成集算器SPL组表来进行测试。数据按orderdate、area、salesman字段升序排列,要求查询出各地区各销售人员的销售总额,也就是按area、salesman进行分组,结果集总共有100万组。由于Oracle输出这么多行结果需要很长的时间,所以对分组结果再进行一次过滤,只输出销售总额小于471000元的订单,结果只有11条,输出就不占时间了。三、  测试1.  Oracle测试编写查询测试SQL如下:select * from (select   /*+ parallel(n)  */area, salesman, sum(amount) as amountfrom salesgroup by area, salesman) where amount<471000;其中/*+ parallel(n) */ 用于并行测试,n为并行数。2.  SPL后半有序分组编写SPL脚本如下:

A1=now()2=file("/home/ctx/sales.ctx").create().cursor@m(area,salesman,amount;;1)3=A2.groups@h(area,salesman;sum(amount):amount).select(amount<471000)4=interval@s(A1,now())groups分组时加选项@h就表示分组字段是后半有序(分段有序)的,让SPL先用快速排序算法对分组字段排序,之后再采用有序分组来优化。需要说明的是,后半有序分组都是在内存中完成的,要求内存中能装下分组后的结果集,多路并行时要求内存能同时放下n个结果集(n为并行路数)。3.  SPL  HASH分组前述SPL脚本中去掉groups的选项@h,就是采用HASH分组了。4.  测试结果测试结果如下,单位(秒):并行数124Oracle387195104SPL (HASH)405208121SPL (后半有序)25214283从测试结果看,SPL后半有序分组的运行时间比使用HASH分组的SPL和Oracle都要快不少,效率提高50%以上,性能提升比较明显。Java写的SPL常规分组比C语言写的Oracle略慢也是正常现象(测试中使用了所有列,SPL的列存优势没有效果)。

(0)

相关推荐

  • Oracle外部表详解

    外部表概述 外部表只能在Oracle 9i之后来使用.简单地说,外部表,是指不存在于数据库中的表.通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数 ...

  • 性能优化技巧:有序分组

    一.  问题背景与适用场景通常分组计算都采用hash方案,即先计算分组字段的hash值,hash值相同的记录被分拣到一个小集合里,然后在这个小集合中遍历找分组字段值相同的聚合成一组.分组的复杂度(比较 ...

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

    一.  问题背景与适用场景在对数据集进行排序运算时,有时会遇到这样一种场景:数据集T已经按字段a有序,而字段b无序,现在我们要将T按a.b排序,我们称之为前半有序(a有序)的排序.此时我们能想到一种优 ...

  • 性能优化技巧:遍历复用提速多次分组

    我们知道,大数据运算性能的瓶颈常常是在外存(也就是硬盘)IO上,因为外存访问性能要比内存低一两个数量级.因此,做性能优化时,减少硬盘的访问量有时要比减少CPU计算量更为重要.同一个任务,如果能使用硬盘 ...

  • 性能优化技巧:有序定位关联提速主子关联后的过滤

    一.  问题背景与适用场景在<性能优化技巧:有序归并>中我们验证了有序归并算法提高关联性能的效果,那么还有没有进一步提升的空间呢?能不能再减少数据的读取量从而再提速呢?通常主子关联后还会再 ...

  • 揭秘 Vue.js 九个性能优化技巧

    这篇文章主要参考了 Vue.js 核心成员 Guillaume Chau 在 19 年美国的 Vue conf 分享的主题:9 Performance secrets revealed,分享中提到了九 ...

  • 性能优化技巧:大事实表与大维表关联

    一.  问题背景与适用场景在<性能优化技巧:小事实表与大维表关联>中,我们尝试了小事实表与大维表关联时的性能优化方法,该方法利用了小事实表可以装入内存的特点,将关联键汇集排序后到大维表中查 ...

  • 性能优化技巧:小事实表与大维表关联

    一.  问题背景与适用场景在主子表关联查询中,有时会遇到这样一种情况:按条件过滤后的事实表数据量很小,能够全部装载进内存或仅比内存略大一点:而要关联的维表数据量很大,比内存要大很多.这种时候,如果维表 ...

  • 性能优化技巧:附表

    一.  问题背景与适用场景在<性能优化技巧:有序归并>中我们见证了有序归并算法提升主子表的关联性能,在集算器中,还有进一步提高性能的办法-附表.集算器组表支持主子表保存在同一文件中,先用主 ...

  • 性能优化技巧:外键序号化

    一.  问题背景与适用场景在<性能优化技巧:部分预关联>一文中,我们介绍了将维表内存化并预关联的技术,但事实表与维表关联时,仍需进行hash计算和比对,怎么提高这一步的性能呢?我们今天再介 ...