【摘要】
看起来很简单的集合运算放在大数据的场景下,如果还想获得高性能就需要充分了解数据特征和计算特征才能设计出高效算法。充分利用序运算就是一种好办法!
交并差是常见的集合运算,SQL 中对应的 intersect/union/minus 计算也很简单。不过当数据量较大时,这类集合运算性能往往偏低,尤其当参与计算的数据量超过内存容量时,性能表现会十分糟糕。
本文专门针对这种情况下的高性能计算(HPC)需求,讨论如何使用集算器 SPL 语言通过有序计算思路显著提高大数据量下交并差三类集合运算的性能。下面讨论中使用了一个实际用户在数据库选型时的评测用例:数据基于数据库的 2 个表,共计 105 亿行数据,执行相关运算后,以输出第一批 500 条记录所用时间来衡量哪个数据库性能更优。
测试环境
类别 |
配置 |
机型 |
X86 |
CPU |
E5-2680 v4 @ 2.40GHz |
内存 |
512GB |
数据硬盘存储 |
SAS 3TB |
集群数量 |
4 台 |
网络环境 |
万兆 |
MPP 数据库资源配置(单节点) |
硬盘:SSD 1.9T 内存:20GB(JVM) + 12GB(分片库) |
集算器资源配置(单节点) |
硬盘:SAS 1T 内存:120GB |
操作系统 |
CentOS6.8(64 位) |
数据描述
数据情况
表名称 |
数据量 |
数据结构 |
数据内容 |
A |
103.68亿 |
52个字段,a1为timestamp。其他字段为字符型,长度=10 |
a1为1天的时间均匀分布数据,时间跨度为5天(每秒24000条),其他字段数据随机生成。 |
B |
1728.048万 |
2个字符字段,长度=10 |
2个字段生成规律依照A表的a3和a7字段 |
索引
数据表 |
数据库索引 |
A表 |
a1、a3、a7字段建立btree索引,a4建立基于btree的varchar_pattern_ops索引。 |
B表 |
b1、b2字段建立btree索引 |
样例数据
a1-a52 列值:
2018-01-0