1. 测试目的
针对相同的硬件环境和计算任务,对比Oracle和集算器的性能差异,为客户选型提供参考。
2. 硬件环境
设备数量:1台
CPU:16核 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
内存:20G
3. 软件环境
操作系统:CentOS6.4 64位
JDK:1.6 64位
4. 测试对象
Oracle:11g(64位),本文中简称为Oracle。
集算器:v3.1。集算器按照数据存储方式的不同分为“文本文件、行式二进制文件(不分段文件)、行式二进制(分段文件)和列式二进制文件”四种不同测试对象,本文中简称为集算器文本、集算器行存、集算器行存分段、集算器列存。
5. 方案说明
对比的相同点:
1、Oracle和集算器运行于相同的硬件和操作系统之上,执行任务的时候没有其他负载的干扰。
2、执行的任务输入数据、算法和输出数据均相同。
3、对外提供调用接口相同,都是JDBC调用,返回结果集。
对比的不同点:
1、存储方式不同,Oracle是内部存储数据,对外表现为数据表;集算器是利用操作系统存储数据,表现为操作系统本地文件,具体的又有文本文件、行式二进制文件和列式二进制文件三种。
2、算法实现的方式不同,Oracle是以sql的方式来实现算法的;集算器是以网格程序脚本来实现算法。
6. 分组汇总
6.1.算法说明
输入:采用一个宽表A和一个窄表B来作为输入。A表有100个字段,6900万行记录,占用硬盘空间80G。B 表有10个字段,11亿行记录,占用硬盘空间80G。
计算:针对表每张表中的1到4个字符串类型的字段(g1、g2、g3、g4)做分组,对1到4个数值型的字段(n1、n2、n3、n4)做汇总sum计算。
输出:由g1、g2、g3、g4和sum(n1)、sum(n2)、sum(n3)、sum(n4)组成的结果表C。
说明:A表字段多,所以采用集算器列存二进制文件的方式是有意义的。B表字段较少,因此不采用集算器二进制列存的方式,仅对比Oracle、集算器文本和集算器行存(二进制)三个测试对象。
6.2. Oracle sql示例
A表查询sql(4个分组字段4个汇总字段)
Select g1,g2,g3,g4,sum(n1),sum(n2),sum(n3),sum(n4) from A group by g1,g2,g3,g4
B表查询sql(4个分组字段4个汇总字段)
Select g1,g2,g3,g4,sum(n1),sum(n2),sum(n3),sum(n4) from B group by g1,g2,g3,g4
6.3. 集算器 脚本示例
主程序(1个分组字段一个汇总字段部分)
子程序groupsub.dfx
子程序groupsubb.dfx
子程序groupsubc.dfx
6.4.1A表(宽表)并行数为1(无并行)
统计计算所用时间,单位:秒。
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
结果行数 |
1分组1汇总 |
232 |
402 |
295 |
42 |
34 |
1分组4汇总 |
248 |
435 |
296 |
62 |
34 |
4分组1汇总 |
263 |
461 |
290 |
101 |
1464 |
4分组4汇总 |
285 |
502 |
313 |
121 |
1464 |
分析:
1、由于列式存储对性能提高明显,所以集算器列存计算时间最短性能最高;Oracle因为是行式存储所以性能次之;因为是单进程没有并发的情况,所以集算器行存和集算器文本性能较低,两者之中集算器行存是二进制所以比集算器文本要快。
2、在每个测试对象内部对比,一般来说算法越复杂计算时间越长,因此1分组1汇总计算最快,4分组4汇总最慢。
6.4.2. A表(宽表)并行数为4
统计计算所用时间,单位:秒。
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
结果行数 |
1分组1汇总 |
259 |
274 |
295 |
43 |
34 |
1分组4汇总 |
272 |
275 |
297 |
56 |
34 |
4分组1汇总 |
286 |
264 |
315 |
99 |
1464 |
4分组4汇总 |
294 |
265 |
314 |
113 |
1464 |
结果分析:列式存储对性能提高的作用较大。
6.4.3 B表(窄表)并行数为1(无并行)
统计计算所用时间,单位:秒。
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
1分组1汇总 |
456 |
630 |
538 |
296 |
1分组4汇总 |
637 |
933 |
694 |
446 |
4分组1汇总 |
1139 |
1170 |
888 |
714 |
4分组4汇总 |
1246 |
1537 |
1080 |
936 |
6.4.4 B表(窄表)并行数为4
统计计算所用时间,单位:秒。
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
1分组1汇总 |
482 |
175 |
383 |
155 |
1分组4汇总 |
664 |
258 |
478 |
155 |
4分组1汇总 |
965 |
314 |
650 |
197 |
4分组4汇总 |
974 |
393 |
729 |
235 |
6.4.5 B表(窄表)并行数为8
统计计算所用时间,单位:秒。
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
1分组1汇总 |
486 |
183 |
436 |
159 |
1分组4汇总 |
675 |
161 |
537 |
176 |
4分组1汇总 |
976 |
191 |
681 |
162 |
4分组4汇总 |
968 |
220 |
761 |
169 |
6.5. 进一步的对比分析
6.5.1并发数量对A表(宽表)计算性能的影响
这里以A表(宽表)的4分组4汇总的测试数据来横向对比一下,不同并发数量对计算性能的影响。
并行数 |
Oracle |
集算器 |
集算器 |
集算器 |
结果行数 |
1并行 |
285 |
502 |
313 |
121 |
1464 |
4并行 |
294 |
265 |
314 |
113 |
1464 |
分析:并行计算对集算器文本性能提高明显,其他测试对象不明显。原因在于集算器文本是分段多游标读取数据的,集算器行存和列存都是单个二进制文件,无法多游标分段读取。如果事先将文件分段保存成多个,就可以用分段多游标读取可以提升速度。Oracle并行速度提高不明显的原因应该是内部机制造成。
6.5.2 并发数量对B表(窄表)计算性能的影响
这里以B表(窄表)的4分组4汇总的测试数据来横向对比一下,不同并发数量对计算性能的影响。
并行数 |
Oracle |
集算器 |
集算器 |
集算器 |
1并行 |
1246 |
1537 |
1080 |
936 |
4并行 |
974 |
393 |
729 |
235 |
8并行 |
968 |
220 |
761 |
169 |
结果分析:并行计算对集算器行存分段和集算器文本性能提高明显,其他测试对象不明显。原因在于集算器行存分段和集算器文本是分段多游标读取数据的,集算器行存是单个二进制文件,无法多游标分段读取。集算器行存分段是事先将文件分段保存成多个,就可以用分段多游标读取可以提升速度。Oracle并行速度提高不明显的原因应该是内部机制造成。