TPCH10G 测试:OceanBase TiDB Oracle SPL
前几天听说 OceanBase 打榜了 TPCH 的第一名,之后又看到这样一个测试报告《OceanBase 开源版与 TiDB 对比测试报告》。
先点评一下这个测试报告:
1. 坦白地说,这个测试还不太专业,并不能比出分布式大数据计算的关键能力。TPCH10G 的数据量相对于这些机器内存实在太小了(单机内存都超过数据量 18 倍以上)。这种情况下,再加上预热,数据已经全部缓存到内存了,列存基本不起作用,也就谈不上对比列存引擎的能力了。而且,数据量太小,会被作为小表复制到集群中的每个节点,分布式计算中重要的 Shuffle 能力也无法被考查到,网络负担仅仅是些汇总结果的传输,而 TPCH 的结果集都很小,这个时间可以忽略不计。
2. 目前这个数据量对比的是纯 CPU 计算能力,本质上是在对比 SQL 优化引擎的能力。如果直接按 SQL 书写的逻辑去计算,那计算量通常会很大,也就会很慢了。但数据库都会有优化,不会严格按 SQL 的逻辑来计算,会在不改变运算目标时尽量采用更低复杂的算法,就可能跑得更快了。从这个测试结果上看,TiDB 的 SQL 优化引擎要明显强过 OceanBase。
以往的经验,Oracle 的 SQL 优化引擎做得很好。如果不能在列存和集群上占便宜的话,很多专业 OLAP 数据库都跑不过 Oracle。而当前这个场景就是这样,数据量太小可以全部缓存进单机的内存,列存失去意义,集群也沦为简单地用多机分摊运算。所以我们猜测 Oracle 会比这两个都快,单机的 Oracle 甚至有可能跑过集群的 OceanBase。
之前我们还用 SPL 重写过 TPCH 并和 Oracle 对比《全国产计算数据库性能测试报告》。SPL 可以直接实现高性能算法而不必寄希望于数据库的优化引擎,相当于已经人为实现了优化。实测的结果表明,在大数据量(超过内存)时 SPL 能比 Oracle 有数倍的优势,这主要是因为列存以及好算法能减少外部缓存而造成的。但对于小数据量,这些环节的时间占比会少很多,估计就不会有明显优势了。
于是,造了一套 10G 的 TPCH 数据,并安装了 Oracle 和 SPL 在单机上分别跑,测试服务器 CPU 是 12 核 1.7G 的 Intel3014。结果如下:
单位:秒 | TiDB | OceanBase | Oracle | SPL |
96*2.4G | 96*2.4G | 12*1.7G | 12*1.7G | |
Q1 | 0.82 | 2.82 | 2.93 | 3.74 |
Q2 | 0.42 | 1.17 | 0.63 | 0.62 |
Q3 | 0.43 | 1.90 | 2.14 | 1.87 |
Q4 | 0.37 | 2.63 | 1.62 | 1.37 |
Q5 | 0.61 | 3.37 | 3.34 | 2.15 |
Q6 | 0.12 | 1.64 | 0.88 | 0.97 |
Q7 | 0.32 | 2.86 | 15.90* | 2.32 |
Q8 | 0.66 | 3.04 | 1.88 | 2.22 |
Q9 | 1.39 | 6.56 | 5.62 | 6.78 |
Q10 | 0.72 | 1.90 | 4.35* | 1.72 |
Q11 | 0.29 | 0.63 | 0.30 | 0.70 |
Q12 | 0.27 | 1.41 | 1.63 | 1.98 |
Q13 | 0.46 | 1.29 | 2.35 | 6.49 |
Q14 | 0.26 | 0.43 | 1.09 | 1.31 |
Q15 | 0.31 | 1.27 | 1.28 | 1.36 |
Q16 | 0.29 | 0.75 | 1.06 | 1.33 |
Q17 | 0.78 | 6.51 | 1.26 | 1.79 |
Q18 | 0.94 | 1.55 | 8.65* | 1.64 |
Q19 | 0.35 | 1.98 | 2.30 | 1.99 |
Q20 | 0.47 | 5.94 | 2.83 | 1.70 |
Q21 | 0.90 | 3.21 | 3.56 | 3.12 |
Q22 | 0.23 | 0.86 | 0.63 | 1.50 |
SUM | 11.41 | 53.72 | 66.23 | 48.64 |
(前两列测试结果来自上述的测试报告)
Oracle 有三个查询可能执行路径被搞晕了,有点奇怪地慢,但也懒得给它再调优了。因为,即使这样,它的单机速度也基本上和 OceanBase 的集群相当了,如果再考虑到 CPU 核数和频率,可以认为还更快一些。
Oracle 单机速度赶不上 TiDB 集群了,但换算后核数和频率后,单位 CPU 的速度还是比 TiDB 要稍快一点。不过两者已经比较接近,看起来 TiDB 在 SQL 优化方面做得确实不错(Oracle 在这方面真地是一座高山),HTAP 中的 A 是很实在的。
之前猜测的结论基本都成立。
SPL 在小数据量上的复杂计算上仍然能占到便宜,但 Java 产生对象和计算上又吃点亏,总体结果和 Oracle 相比仍有优势但很小,可以算基本持平。这也和之前预计的一样。
OceanBase 在这个测试中表现的性能相对较弱,原因有可能如上述测试报告所言,开源版和用于打榜的企业版有差距,开源版中没有提供较好的 SQL 优化引擎,当然也有可能 OceanBase 的优化确实还不够好,因为 OceanBase 之前并没有作为 OLAP 数据库发展,在这方面下的功夫不够也算正常。而 TiDB 从事 HTAP 数据库已经有一段时间了,SQL 优化方面的积累相对丰富也不奇怪。至于 SPL,则是用不同的代码直接实现高性能算法(代码量其实比 SQL 更小),不会出现数据库优化引擎找不到合理执行路径的现象,所以虽然低层用 Java 实现却仍然能获得较好的运算性能,不过对程序员的要求会稍高一些。