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则不明显。