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