Oracle与集算器对比测试报告(续)
7.多表连接
7.1.算法说明
输入:
本测试采用一组宽表和一组窄表来作为输入,宽表组和窄表组只是字段不同,参加运算的字段和算法都一样。
宽表组:数据t表(或者文件)是事实表,共100个字段,6900万行,占硬盘80G;Di、Dj表示维表,都是100列,1000万行,占硬盘10G。
窄表组:数据t表(或者文件)是事实表,共10个字段,11亿行,占硬盘80G;Di、Dj表示维表,都是100列,1000万行,占硬盘10G。
其中:
t表选出字段为sum(t11)、sum(t12),di选出字段为sum(di11),dj选出字段为sum(dj11);
dj表与dj表连接是左连接:di.di23=dj.dj23
di分组字段为di31,dj分组字段为dj31;
计算:
计算分为三种:
t*di:
t表与di表连接左连接:t.t21=di.di21,
连接之后按照di31分组求sum;
t*di*dj:
t表与di表连接左连接:t.t21=di.di21,
t表与dj表连接是左连接:t.t22=dj.dj22
连接之后按照di31和dj31分组求sum;
t*(di*dj):
t表与di表连接左连接:t.t21=di.di21,
di表与dj表连接是左连接:di.di23=dj.dj23,
连接之后按照di31和dj31分组求sum。
输出:
连接、分组求和之后的结果。
说明:
宽表组表字段多,所以采用集算器列存二进制文件的方式是有意义的。窄表组表字段较少,因此不采用集算器二进制列存的方式,对比Oracle、集算器文本、集算器行存和集算器行存分段四个测试对象。
7.2.Oracle sql示例
t*di:
Select sum(t.t11),sum(t.t12),sum(di.di11)
from t left join di on di21=t.t21
group by di.di31
t*di*dj:
Select sum(t.t11),sum(t.t12),sum(di.di11),sum(dj.dj11)
from t left join di on di.di21=t.t21 left join dj on dj.dj22=t.t22
group by di.di31,dj.dj31
t*(di*dj):
Select sum(t.t11),sum(t.t12),sum(di.di11),sum(dj.dj11)
from t left join dion di.di21=t.t21 left join dj on dj.dj23=di.di23
group by dj.dj31
7.3.集算器脚本示例
main.dfx
joinsub.dfx
joinsubb.dfx
7.4.测试结果和分析
7.4.1 宽表组并行数1(无并行)
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
T*D |
435 |
543 |
340 |
131 |
T*D*D |
549 |
612 |
382 |
185 |
T*(D*D) |
500 |
553 |
340 |
137 |
结果分析:
1、测试对象之间对比,由于列式存储对性能提高明显,所以集算器列存计算时间最短性能最高;其他三个测试对象因为是行式存储所以性能较低;由于事实表和维表之间存在外键关系,因此集算器行存可以采用较快的switch方法来实现jion,所以比oracle稍快。
7.4.2宽表组并行数4
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
T*D |
421 |
338 |
325 |
55 |
T*D*D |
595 |
358 |
325 |
72 |
T*(D*D) |
416 |
348 |
332 |
64 |
结果分析:
1、测试对象之间对比,由于列式存储对性能提高明显,所以集算器列存计算时间最短性能最高;其他三个测试对象因为是行式存储所以性能较低;由于事实表和维表之间存在外键关系,因此集算器行存可以采用较快的switch方法来实现jion,所以比oracle稍快。集算器文本采用4个节点同时并行计算,所以超过了oracle的性能。
7.4.3窄表组并行数1(无并行)
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
T*D |
508 |
1824 |
1415 |
1330 |
T*D*D |
4846 |
2920 |
2540 |
2355 |
T*(D*D) |
3684 |
2142 |
1663 |
1479 |
性能排名:
算法 |
第1名 |
第2名 |
第3名 |
第4名 |
T*D |
Oracle |
集算器 |
集算器 |
集算器 |
T*D*D |
集算器 |
集算器 |
集算器 |
Oracle |
T*(D*D) |
集算器 |
集算器 |
集算器 |
Oracle |
结果分析:
1、T*D算法而言,oracle性能具备明显的优势。
2、其他两种算法,集算器的计算步骤是人为决定的。由于事先知道事实表和维表之间的外键关系,并且知道表大小差异,可以采用最快的switch方法来计算。而oracle采用自动优化的方式,不够灵活,所以较慢。
7.4.4 窄表组并行数4
算法 |
Oracle |
集算器 |
集算器 |
集算器 |
T*D |
1676 |
462 |
537 |
353 |
T*D*D |
4527 |
788 |
743 |
641 |
T*(D*D) |
3298 |
531 |
576 |
420 |
结果分析:
1、集算器的计算步骤是人为决定的。由于事先知道事实表和维表之间的外键关系,并且知道表大小差异,可以采用最快的switch方法来计算。而oracle采用自动优化的方式,不够灵活,所以较慢。
7.5.进一步的对比分析
以窄表组的T*(D*D)的测试数据来横向对比一下,不同并发数量对计算性能的影响。
并行数 |
Oracle |
集算器 |
集算器 |
集算器 |
1并行 |
3684 |
2142 |
1663 |
1479 |
4并行 |
3298 |
531 |
576 |
420 |
结果分析:并行计算对集算器性能提高明显,Oracle则不明显。