性能优化技巧:前半有序时的排序
一、 问题背景与适用场景在对数据集进行排序运算时,有时会遇到这样一种场景:数据集T已经按字段a有序,而字段b无序,现在我们要将T按a、b排序,我们称之为前半有序(a有序)的排序。此时我们能想到一种优化的排序方法:从T中先取出a值相同的一组记录,再这一组内对b排序。然后再依次取出下一组a值相同的记录,重复这个动作,直到完成T中所有记录的排序。这种方法的好处是不需要对T中所有记录进行大排序,一次只需取
性能优化技巧:有序分组
一、 问题背景与适用场景通常分组计算都采用hash方案,即先计算分组字段的hash值,hash值相同的记录被分拣到一个小集合里,然后在这个小集合中遍历找分组字段值相同的聚合成一组。分组的复杂度(比较次数),取决于hash函数的重码率。在hash空间比较小时,重码率就高,比较次数就会多,性能会受较大影响。为了提高性能,就需要分配较大的内存来存放 hash 表。另外,有些数据类型(长字串)的 hash
性能优化技巧:大事实表与大维表关联
一、 问题背景与适用场景在《性能优化技巧:小事实表与大维表关联》中,我们尝试了小事实表与大维表关联时的性能优化方法,该方法利用了小事实表可以装入内存的特点,将关联键汇集排序后到大维表中查找,避免了遍历大维表的动作。如果事实表与维表都大到不能装载到内存时,这个办法就不再有效了,那么,还有什么办法提高性能呢?SQL的方案是对两个表做HASH分堆,拆小到内存可以放下的地步,分别写入外存,然后再分别读入进
性能优化技巧:小事实表与大维表关联
一、 问题背景与适用场景在主子表关联查询中,有时会遇到这样一种情况:按条件过滤后的事实表数据量很小,能够全部装载进内存或仅比内存略大一点;而要关联的维表数据量很大,比内存要大很多。这种时候,如果维表是按键有序存储时,因为事实表涉及的维表记录较少,可以一次性用二分查找方法找出来,而不必象HASH运算那样遍历这个大维表,从而提高运算性能。SPL提供了这种方法,我们实例测试一下,并且与使用HASH JO
性能优化技巧:附表
一、 问题背景与适用场景在《性能优化技巧:有序归并》中我们见证了有序归并算法提升主子表的关联性能,在集算器中,还有进一步提高性能的办法—附表。集算器组表支持主子表保存在同一文件中,先用主表创建组表文件,再在主表上附加上子表,子表必须含有主表的维字段,并通过这个字段进行关联,这样的子表称为附表。附表在存储时,关联键只需在主表保存一次,子表就不用保存了,在读取时就可以减少读硬盘的时间。并且子表已经通过
性能优化技巧:有序归并
一、 问题背景与适用场景在以前的文章中我们介绍过,关系数据库在进行表间关联时是使用HASH分段技术。设两个关联表的规模(记录数)分别是 N 和 M,则 HASH 分段技术的计算复杂度(关联字段的比较次数)大概是 SUM(Ni*Mi),其中 Ni 和 Mi 分别是 HASH 值为 i 的两表记录数,满足 N=SUM(Ni) 和 M=SUM(Mi),这大概率会比完全遍历时的复杂度 N*M 要小很多(运
多维分析后台实践 3:维度排序压缩
用实例、分步骤,详细讲解多维分析(OLAP)的实现。
性能优化技巧:外键序号化
一、 问题背景与适用场景在《性能优化技巧:部分预关联》一文中,我们介绍了将维表内存化并预关联的技术,但事实表与维表关联时,仍需进行hash计算和比对,怎么提高这一步的性能呢?我们今天再介绍一种优化技巧:外键序号化。外键序号化的思路是,如果维表的主键是从1开始的自然数(也就是记录所在行号),那么就可以用键值直接按行号定位维表记录,而不再需要计算和比对HASH值了,从而加快与维表关联的速度,进一步提升
性能优化技巧:部分预关联
一、 问题背景与适用场景在《性能优化技巧:预关联》中,我们测试了将数据表事先全部加载进内存并做好关联后的查询性能优化问题,但如果内存不够大,不能将维表和事实表全部装入,那怎么办呢?此时,可以将维表预先装入内存,建好索引,实现维表部分的预关联,省去一半hash计算。我们下面再来测试一下这种场景,这次用数据量最大、内存装不下的lineitem表做测试,在SPL部分预关联中,将其它7张表预先装进内存,而
性能优化技巧:预关联
一、 问题背景与适用场景SQL中JOIN的性能是个老大难问题,特别是关联表较多时,计算性能会急剧下降。SQL实现JOIN一般是采用HASH分堆的办法,即先计算关联键的HASH值,再将相同HASH值的记录放到一起再做遍历对比。每一个JOIN都要做一轮这样的运算。如果数据量相对于内存并不是很大,可以事先全部加载到内存中,那么可以利用内存指针的机制,事先把关联关系建立好。这样做运算时就不必再做HASH与
性能优化技巧:TopN
TopN是常见的运算,用SQL写出来是这样(以Oracle为例):select * from (select * from T order by x desc) where rownum<=N这个SQL的运算逻辑从其语句上看,要先做排序(Order by),然后再取出前N条。我们知道,排序是个非常慢的动作,复杂度很高(n*logn),如果涉及数据量大到内存放不下,那还需要进行内外存数据交换,
性能优化技巧:遍历复用提速多次分组
我们知道,大数据运算性能的瓶颈常常是在外存(也就是硬盘)IO上,因为外存访问性能要比内存低一两个数量级。因此,做性能优化时,减少硬盘的访问量有时要比减少CPU计算量更为重要。同一个任务,如果能使用硬盘访问量更少的算法,即使CPU计算量不变甚至略多一点,也会获得更好的性能。分组汇总需要对数据集进行遍历。同一个数据集可能会按不同维度进行分组,这样原则上就要遍历多次,大数据时就会涉及多遍硬盘访问。但是,
SQL 和 SPL 的有序运算对比
【摘要】有序运算是指按照一定的次序对有序集合的成员进行计算。SQL 和 SPL 是大家比较熟悉的程序语言,本文将探讨对于有序运算问题,这两种语言的解决方案和基本原理。如何简便快捷的处理有序运算,这里为你全程解析,并提供 SQL 和 SPL 示例代码。使用过 SQL 或 SPL 的朋友对计算字段都不会陌生,比如 firstname+lastname,year(birthday),这些计算字段属于行内
性能优化技巧:有序分组
一、 问题背景与适用场景通常分组计算都采用hash方案,即先计算分组字段的hash值,hash值相同的记录被分拣到一个小集合里,然后在这个小集合中遍历找分组字段值相同的聚合成一组。分组的复杂度(比较次数),取决于hash函数的重码率。在hash空间比较小时,重码率就高,比较次数就会多,性能会受较大影响。为了提高性能,就需要分配较大的内存来存放 hash 表。另外,有些数据类型
集算器 SPL 抓取网页数据
集算器 SPL 支持抓取网页数据,根据抓取定义规则,可将网页数据下载到在本地进行统计分析。
高并发账户记录查询
面对高并发账户记录查询问题,按照本文的介绍一步一步操作,就能有效提升性能
Python 关联处理
将两个表或者多个表关联在一起是常见的运算,这时通常使用 SQL join 的方式进行关联并进行后续计算。但有时数据并不存储在数据库,而是以文件的形式存储在文件系统,单纯为了计算而把数据存储到数据库有点得不偿失。Python 的 Pandas 提供了丰富的关联运算函数,能更方便的完成文本文件间的关联计算,现在我们就一起来讨论下 Python 的关联处理。基础关联所谓关联是指两张数据表通过某个字段或者
性能优化技巧:后半有序分组
一、 问题背景与适用场景什么是后半有序?如果数据集T已经按字段a、b有序,现在我们要将T按b排序或分组时,因为在a值相同的段内,b都是有序的,这种要排序或分组的字段在分段内有序的情况就称为后半有序。我们知道,快速排序算法的原理就是一种递归的分段排序再归并的算法,对于后半有序这样的已经大体有序的数组,快速排序的速度已经能够很快。所以如果采用快速排序算法对T按b排序后,就可以使用
性能优化技巧:前半有序时的排序
一、 问题背景与适用场景在对数据集进行排序运算时,有时会遇到这样一种场景:数据集T已经按字段a有序,而字段b无序,现在我们要将T按a、b排序,我们称之为前半有序(a有序)的排序。此时我们能想到一种优化的排序方法:从T中先取出a值相同的一组记录,再这一组内对b排序。然后再依次取出下一组a值相同的记录,重复这个动作,直到完成T中所有记录的排序。这种方法的好处是不需要对T中所有记录
字符串和日期时间的处理
字符串和日期时间都是基础数据类型。虽然说是基础,使用起来却经常给我们带来麻烦。SPL 提供了丰富而简洁的函数,可以轻松解决字符串和日期时间的难题。