Skip to content

Commit

Permalink
[ASoC] report for subtask (#2107)
Browse files Browse the repository at this point in the history
Co-authored-by: Longbin Lai <longbin.lailb@alibaba-inc.com>
  • Loading branch information
Swthaochen and longbinlai committed Oct 1, 2022
1 parent 751e3e7 commit b1132cc
Showing 1 changed file with 125 additions and 0 deletions.
125 changes: 125 additions & 0 deletions interactive_engine/benchmark/summer_code_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
## SubTask实验结论

**结论一:**apply性能对外层层级数m更敏感,join的性能对内层层级数n更敏感。

证明:这里我们主要通过控制内外层层数之和m+n来观察在不同m与n下apply与join的性能,从而探究它们的性能对于内外层层数的敏感性。这里我们设定m+n=5,于是发现有下表所示的规律:

| | Apply | Join |
| ------------------- | -------------- | --------------- |
| [10,10,10,10][10] | y=9.22x-361.51 | y=2.50x+912.92 |
| [10,10,10][10,10] | y=3.23x-80.87 | y=3.14x+1144.90 |
| [10,10][10,10,10] | y=2.43x+42.54 | y=7.22x+439.34 |
| [10][10,10,10,10] | y=2.38x+101.46 | y=9.85x+208.83 |

可以看见,虽然这里我们制定了m+n都是一个确定的数为5,这也意味着在图中遍历的数据量是一样的,但是对于apply和join来说不同的内外层层级数会影响到两者的查询性能,具体地说对apply来说,如果外层的层级数越大,其查询性能越差,而对join来说恰好相反,如果是外层的层级数越大,内层层级数越小越有利于其进行优化查询。因此我们认为apply对外层数较敏感,join对内层数较敏感。这个规律不仅仅在m+n=5时成立,在总数为4和6的情况下都成立,如下表所示:

| | Apply | Join |
| ---------------- | ------------- | -------------- |
| [10,10,10][10] | y=0.83x-1.96 | y=0.61x+145.10 |
| [10,10][10,10] | y=0.31x+13.08 | y=0.77x+54.06 |
| [10][10,10,10] | y=0.24x+15.33 | y=1.00x+16.84 |

| | Apply | Join |
| ---------------------- | ------------------ | ---------------- |
| [10,10,10,10,10][10] | y=178.32x-37903.19 | y=20.80x+2010.11 |
| [10,10,10,10][10,10] | y=34.26x-360.49 | y=4.03x+6237.84 |
| [10,10,10][10,10,10] | y=26.64x-25.96 | y=26.50x+9588.84 |
| [10,10][10,10,10,10] | y=24.58x+105.79 | y=71.28x+753.91 |

造成这种现象的原因是,我们通过分析dump出来的时间图发现,对apply而言,每次在外层数据遍历完成,继续做内层数据的时候,会做一个fork_subtask的操作,相当于需要把外层遍历的结果传入到内层的输入中,而这个过程需要消耗的时间与Dm呈正相关。因此外层越多,数据量越大,对apply而言性能损失越大。而对于Join而言,外层如果数量越大,dedup完之后的数据与dedup之前的数据差较大,因此一定程度上有利于内层的遍历。当然这里我们也不能保证外层数越大,内层数越少join性能越好,如在外层数为[10,10,10,10,10]与[10]的情况下,join的性能并没有体现出像之前那样递减的趋势,其实这也是因为虽然我们在外层有dedup,但总体上join的Dm还是在增加的,在一定量下随着源节点数目增加会导致join性能变坏,但这种趋势相较于apply会好很多,这也是得益于dedup机制。如果外层数较少的情况,这种优势并不明显,因此相较于apply开销也就越大。

**结论二:**在没有Early-stop的情况下,apply更适用于在外层层级数m较少,Dm数目较小的情况,而join更适合于外层层级数较多,Dm较大的情况。

证明:从结论一种我们得到apply对于外层数越大,性能越差,而join恰好相反,内层数越大性能越差,因此我们从这个结论中可以初步判定apply更适用于外层数较小的情况,join适合外层数较大的情况,于是我们根据以下实验结果得到:

1. 当外层数为1的时候:

| | Apply | Join |
| ---------------------- | --------------- | ---------------- |
| [10][10,10,10,10,10] | y=27.69x+126.86 | y=86.80x+1359.47 |
| [10][10,10,10,10] | y=2.38x+101.46 | y=9.85x+208.83 |
| [10][10,10,10] | y=0.24x+15.33 | y=1.00x+16.84 |
| [10][10,10] | y=0.03x+5.15 | y=0.10x+7.62 |
| [10][10] | y=0.01x+0.50 | y=0.015x+1.11 |

由斜率发现无论内层数量为多少,无论源节点数如何增加, Join拟合的直线斜率都大于apply的斜率,且由结论一可知内层数量增大join性能越差,因此这种情况下join永远也追不上apply。

2. 当外层数为2的时候:

| | Apply | Join |
| ---------------------- | --------------- | --------------- |
| [10,10][10,10,10,10] | y=24.58x+105.79 | y=71.28x+753.91 |
| [10,10][10,10,10] | y=2.43x+42.54 | y=7.22x+439.34 |
| [10,10][10,10] | y=0.31x+13.08 | y=0.77x+54.06 |
| [10,10][10] | y=0.08x+4.13 | y=0.12x+9.22 |

这种情况与外层数为1的情况类似,即使在join性能表现最好的,内层数为1的情况join都无法追上apply,其他的情况则更不可能。

3. 当外层数为3的时候:

| | Apply | Join |
| ---------------------------- | ----------------- | ------------------- |
| [10,10,10][10,10,10,10,10] | y=2735.32x+387.09 | y=6410.62x-3943.60 |
| [10,10,10][10,10,10,10] | y=260.72x-1076.03 | y=247.31x+101611.95 |
| [10,10,10][10,10,10] | y=26.64x-25.96 | y=26.50x+9588.84 |
| [10,10,10][10,10] | y=3.23x-80.87 | y=3.14x+1144.90 |
| [10,10,10][10] | y=0.83x-1.96 | y=0.61x+145.10 |

可以发现在这种情况下Join出现了较apply性能较优的情况,即在内层数小于5的时候join整体的效率要高于apply(虽然在源节点数较小的情况下可能会出现apply较优的情况,但这种情况总会出现一个交点,在交点之后即源节点数达到一定程度之后join的效率要优于apply),且这种优势体现在源节点越大,即Dm越大的时候,join的优势越明显。但是可以发现在内层数大于等于5的时候,join的性能明显降低。显示出类似像外层数为1和2的情况,即无论源节点数怎样变化,join的性能永远不会优于apply。

4. 当外层数为4的时候:

| | Apply | Join |
| ---------------------------- | ------------------ | ------------------- |
| [10,10,10,10][10,10,10,10] | Y=2739.05x-6831.58 | Y=3297.34x+41930.76 |
| [10,10,10,10][10,10,10] | y=259.32x-3.40 | y=17.72x+54375.46 |
| [10,10,10,10][10,10] | y=34.26x-360.49 | y=4.03x+6237.84 |
| [10,10,10,10][10] | y=9.22x-361.51 | y=2.50x+912.92 |

可以发现这种情况和外层数为3的情况一致,在内层层级数较小的时候先是join的性能会相对较好,而随着外层数增大,join的性能急剧下降,从而性能远不如apply。

**结论三:**加入Early-stop机制后,apply更适用于外层层级数少,内层层级数多的情况。

| | Apply | Apply_limit |
| ---------------------------- | ------------------ | ----------------- |
| [10,10,10,10][10,10,10,10] | y=2739.05x-6831.58 | y=381.46x+7385.65 |
| [10,10,10,10][10,10,10] | y=259.32x-3.40 | y=61.81x-1491.62 |
| [10,10,10,10][10,10] | y=34.26x-360.49 | y=26.97x-376.82 |
| [10,10,10,10][10] | y=9.22x-361.51 | y=22.67x-1087.61 |
| [10,10,10][10,10,10,10] | y=2735.32x+387.09 | y=38.59x-630.37 |
| [10,10,10][10,10,10] | y=260.72x-1076.03 | y=5.97x+93.01 |
| [10,10,10][10,10] | y=26.64x-25.96 | y=2.55x+34.73 |
| [10,10,10][10] | y=3.23x-80.87 | y=2.07x+14.34 |
| [10,10][10,10,10,10] | y=24.58x+105.79 | y=3.76x+29.60 |
| [10,10][10,10,10] | y=2.43x+42.54 | y=0.60x+12.90 |
| [10,10][10,10] | y=0.31x+13.08 | y=0.26x+7.94 |
| [10,10][10] | y=0.08x+4.13 | y=0.21x+10.19 |
| [10][10,10,10,10] | y=2.38x+101.46 | y=0.38x+9.10 |
| [10][10,10,10] | y=0.24x+15.33 | y=0.06x+6.33 |
| [10][10,10] | y=0.03x+5.15 | y=0.03x+2.84 |
| [10][10] | y=0.01x+0.50 | y=0.02x+2.38 |

从表中可以看出,加入early-stop机制后并不一定会使apply性能更好,比如在内层数为1的时候,因为early-stop在执行limit操作时会有反馈时间导致在内层数并不太多的时候性能可能会更差。所以可以预见在加入早停机制之后,apply的性能在内层数较多的时候会更好。因此我们对比join和apply_limit如下表所示:

| | Join | Apply_limit |
| ---------------------------- | ------------------- | ----------------- |
| [10,10,10,10][10,10,10,10] | Y=3297.34x+41930.76 | y=381.46x+7385.65 |
| [10,10,10,10][10,10,10] | y=17.72x+54375.46 | y=61.81x-1491.62 |
| [10,10,10,10][10,10] | y=4.03x+6237.84 | y=26.97x-376.82 |
| [10,10,10,10][10] | y=2.50x+912.92 | y=22.67x-1087.61 |
| [10,10,10][10,10,10,10] | y=247.31x+101611.95 | y=38.59x-630.37 |
| [10,10,10][10,10,10] | y=26.50x+9588.84 | y=5.97x+93.01 |
| [10,10,10][10,10] | y=3.14x+1144.90 | y=2.55x+34.73 |
| [10,10,10][10] | y=0.61x+145.10 | y=2.07x+14.34 |
| [10,10][10,10,10,10] | y=71.28x+753.91 | y=3.76x+29.60 |
| [10,10][10,10,10] | y=7.22x+439.34 | y=0.60x+12.90 |
| [10,10][10,10] | y=0.77x+54.06 | y=0.26x+7.94 |
| [10,10][10] | y=0.12x+9.22 | y=0.21x+10.19 |
| [10][10,10,10,10] | y=9.85x+208.83 | y=0.38x+9.10 |
| [10][10,10,10] | y=1.00x+16.84 | y=0.06x+6.33 |
| [10][10,10] | y=0.10x+7.62 | y=0.03x+2.84 |
| [10][10] | y=0.015x+1.11 | y=0.02x+2.38 |

​ 显然,在外层数较少,内层数较大的时候,apply_limit性能更好,如在外层数为1的时候,apply_limit性能永远好于join,在外层数为2的时候也只有内层数为1的时候join性能才会稍微好一点,在外层数为3和为4的时候,一般是join的性能先好于apply_limit,但随着内层数增多,join性能受影响较大,导致性能不如apply_limit。

多线程与分布式情况待完善。

0 comments on commit b1132cc

Please sign in to comment.