前言

虚竹哥今天又来分享干货啦,今天分享一个:开源分析数据库ClickHouse和开源esProc SPL的性能对比。在分享之前,来个福利预告:认真看完文章,文末送本好书。

ClickHouse vs Oracle

开源分析数据库ClickHouse以快著称,真的如此吗?我们通过对比测试来验证一下。

先用ClickHouse(简称CH)、Oracle数据库(简称ORA)一起在相同的软硬件环境下做对比测试。测试基准使用国际广泛认可的TPC-H,针对8张表,完成22条SQL语句定义的计算需求(Q1到Q22)。测试采用单机12线程,数据总规模100G。TPC-H对应的SQL都比较长,这里就不详细列出了。

Q1是简单的单表遍历计算分组汇总,对比测试结果如下:

CH计算Q1的表现要好于ORA,说明CH的列式存储做得不错,单表遍历速度很快。而ORA主要吃亏在使用了行式存储,明显要慢得多了。

但是,如果我们加大计算复杂度,CH的表现怎么样呢?继续看TPC-H的Q2、Q3、Q7,测试结果如下:

计算变得复杂之后,CH性能出现了明显的下降。Q2涉及数据量较少,列存作用不大,CH性能和ORA几乎一样。Q3数据量较大,CH占了列存的便宜后超过了ORA。Q7数据也较大,但是计算复杂,CH性能还不如ORA。

做复杂计算快不快,主要看性能优化引擎做的好不好。CH的列存占据了巨大的存储优势,但竟然被ORA用行式存储赶上,这说明CH的算法优化能力远不如ORA。

TPC-H的Q8是更复杂一些的计算,子查询中有多表连接,CH跑了2000多秒还没有出结果,应该是卡死了,ORA跑了192秒。Q9在Q8的子查询中增加了like,CH直接报内存不足的错误了,ORA跑了234秒。其它还有些复杂运算是CH跑不出来的,就没法做个总体比较了。

CH和ORA都基于SQL语言,但是ORA能优化出来的语句,CH却跑不出来,更证明CH的优化引擎能力比较差。

坊间传说,CH只擅长做单表遍历运算,有关联运算时甚至跑不过MySQL,看来并非虚妄胡说。想用CH的同学要掂量一下了,这种场景到底能有多大的适应面?

esProc SPL登场

开源esProc SPL也是以高性能作为宣传点,那么我们再来比较一下。

仍然是跑TPC-H来看 :

Q2、Q3、Q7这些较复杂的运算,SPL比CH和ORA跑的都快。CH跑不出结果的Q8、Q9,SPL分别跑了37秒和68秒,也比ORA快。原因在于SPL可以采用更优的算法,其计算复杂度低于被ORA优化过的SQL,更远低于CH执行的SQL,再加上列存,最终是用Java开发的SPL跑赢了C++实现的CH和ORA。

大概可以得到结论,esProc SPL无论做简单计算,还是复杂计算性能都非常好。

不过,Q1这种简单运算,CH比SPL还是略胜了一筹。似乎可以进一步证明前面的结论,即CH特别擅长简单遍历运算。

且慢,SPL还有秘密武器。

SPL的企业版中提供了列式游标机制,我们再来对比测试一下:在8亿条数据量下,做最简单的分组汇总计算,对比SPL(使用列式游标)和CH的性能。(采用的机器配置比前面做TPC-H测试时略低,因此测出的结果不同,不过这里主要看相对值。)

简单分组汇总对应CH的SQL语句是:

SQL1:

SELECT mod(id, 100) AS Aid, max(amount) AS Amax
FROM test.t
GROUP BY mod(id, 100)

这个测试的结果是下图这样:

SPL使用列式游标机制之后,简单遍历分组计算的性能也和CH一样了。如果在TPC-H的Q1测试中也使用列式游标,SPL也会达到和CH同样的性能。

测试过程中发现,8亿条数据存成文本格式占用磁盘15G,在CH中占用5.4G,SPL占用8G。说明CH和SPL都采用了压缩存储,CH的压缩比更高些,也进一步证明CH的存储引擎做得确实不错。不过,SPL也可以达到和CH同样的性能,这说明SPL存储引擎和算法优化做得都比较好,高性能计算能力更加均衡。

当前版本的SPL是用Java写的,Java读数后生成用于计算的对象的速度很慢,而用C++开发的CH则没有这个问题。对于复杂的运算,读数时间占比不高,Java生成对象慢造成的拖累还不明显;而对于简单的遍历运算,读数时间占比很高,所以前面测试中SPL就会比CH更慢。列式游标优化了读数方案,不再生成一个个小对象,使对象生成次数大幅降低,这时候就能把差距拉回来了。单纯从存储本身看,SPL和CH相比并没有明显的优劣之分。

接下来再看常规TopN的对比测试,CH的SQL是:

SQL2:

SELECT * FROM test.t ORDER BY amount DESC LIMIT 100

对比测试结果是这样的:

单看CH的SQL2,常规TopN的计算方法是全排序后取出前N条数据。数据量很大时,如果真地做全排序,性能会非常差。SQL2的测试结果说明,CH应该和SPL一样做了优化,没有全排序,所以两者性能都很快,SPL稍快一些。

也就是说,无论简单运算还是复杂运算,esProc SPL都能更胜一筹。

进一步的差距

差距还不止于此。

正如前面所说,CH和ORA使用SQL语言,都是基于关系模型的,所以都面临SQL优化的问题。TPC-H测试证明,ORA能优化的一些场景CH却优化不了,甚至跑不出结果。那么,如果面对一些ORA也不会优化的计算,CH就更不会优化了。比如说我们将SQL1的简单分组汇总,改为两种分组汇总结果再连接,CH的SQL写出来大致是这样:

SQL3:

SELECT *
FROM (
SELECT mod(id, 100) AS Aid, max(amount) AS Amax
FROM test.t
GROUP BY mod(id, 100)
) A
JOIN (
SELECT floor(id / 200000) AS Bid, min(amount) AS Bmin
FROM test.t
GROUP BY floor(id / 200000)
) B
ON A.Aid = B.Bid

这种情况下,对比测试的结果是CH的计算时间翻倍,SPL则不变:

这是因为SPL不仅使用了列式游标,还使用了遍历复用机制,能在一次遍历过程中计算出多种分组结果,可以减少很多硬盘访问量。CH使用的SQL无法写出这样的运算,只能靠CH自身的优化能力了。而CH算法优化能力又很差,其优化引擎在这个测试中没有起作用,只能遍历两次,所以性能下降了一倍。

SPL实现遍历复用的代码很简单,大致是这样:

A B
1 =file("topn.ctx").open().cursor@mv(id,amount)
2 cursor A1 =A2.groups(id%100:Aid;max(amount):Amax)
3 cursor =A3.groups(id\200000:Bid;min(amount):Bmin)
4 =A2.join@i(Aid,A3:Bid,Bid,Bmin)

再将SQL2常规TopN计算,调整为分组后求组内TopN。对应SQL是:

SQL4:

SELECTgid,groupArray(100)(amount) AS amount
FROM
(SELECTmod(id, 10) AS gid,amountFROM test.topnORDER BYgid ASC,amount DESC
) AS a
GROUP BY gid

这个分组TopN测试的对比结果是下面这样的:

CH做分组TopN计算比常规TopN慢了42倍,说明CH在这种情况下很可能做了排序动作。也就是说,情况复杂化之后,CH的优化引擎又不起作用了。与SQL不同,SPL把TopN看成是一种聚合运算,和sum、count这类运算的计算逻辑是一样的,都只需要对原数据遍历一次。这样,分组求组内TopN就和分组求和、计数一样了,可以避免排序计算。因此,SPL计算分组TopN比CH快了22倍。

而且,SPL计算分组TopN的代码也不复杂:

A
1 =file("topn.ctx").open().cursor@mv(id,amount)
2 =A1.groups(id%10:gid;top(10;-amount)).news(#2;gid,~.amount)

不只是跑得快

再来看看电商系统中常见的漏斗运算。SPL的代码依然很简洁:

A B
1 =["etype1","etype2","etype3"] =file("event.ctx").open()
2 =B1.cursor(id,etime,etype;etime>=date("2021-01-10") && etime<date("2021-01-25") && A1.contain(etype) && …)
3 =A2.group(id).(~.sort(etime)) =A3.new(~.select@1(etype==A1(1)):first,~:all).select(first)
4 =B3.(A1.(t=if(#==1,t1=first.etime,if(t,all.select@1(etype==A1.~ && etime>t && etime<t1+7).etime, null))))
5 =A4.groups(;count(~(1)):STEP1,count(~(2)):STEP2,count(~(3)):STEP3)

CH的SQL无法实现这样的计算,我们以ORA为例看看三步漏斗的SQL写法:

with e1 as (select gid,1 as step1,min(etime) as t1from Twhere etime>= to_date('2021-01-10', 'yyyy-MM-dd') and etime

ORA 的SQL写出来要三十多行,理解起来有相当的难度。而且这段代码和漏斗的步骤数量相关,每增加一步数就要再增加一段子查询。相比之下,SPL就简单得多,处理任意步骤数都是这段代码。

这种复杂的SQL,写出来都很费劲,性能优化更无从谈起。

而CH的SQL还远不如ORA,基本上写不出这么复杂的逻辑,只能在外部写C++代码实现。也就是说,这种情况下只能利用CH的存储引擎。虽然用C++在外部计算有可能获得很好的性能,但开发成本非常高。类似的例子还有很多,CH都无法直接实现。

总结一下:CH计算某些简单场景(比如单表遍历)确实很快,和SPL的性能差不多。但是,高性能计算不能只看简单情况快不快,还要权衡各种场景。对于复杂运算而言,SPL不仅性能远超CH,代码编写也简单很多。SPL能覆盖高性能数据计算的全场景,可以说是完胜CH。

SPL资料

  • SPL下载
  • SPL源代码

粉丝福利

送两本书:
一本:

另一本:

如何免费获得该书呢?

  • 本文优质评论一条,且该评论点赞数是最高的,获得《Spring Boot进阶:原理、实战与面试题分析》一本!

    • 例如2条评论点赞数并列第一的,以评论的时间谁早!

    • 之前写的【Spring Boot进阶:原理、实战与面试题分析】读后感

  • 参与评论送书:随机抽取一位幸运读者,送一本《effective java》。

    • 可以看下介绍高级JAVA程序员必备:必看书籍清单
  • 统计截止时间:2022/08/22 21:59:59

开源分析数据库ClickHouse和开源esProc SPL的性能对比相关推荐

  1. 云原生小课堂 | 一文入门性能凶悍的开源分析数据库ClickHouse

    clickhouse简介 ClickHouse是一个开源的,面向列的MPP架构数据分析数据库(大规模并行处理),由俄罗斯Yandex为OLAP和大数据用例创建. ClickHouse全称是Click ...

  2. python3 array为什么不能放不同类型的数据_来自俄罗斯的凶猛彪悍的分析数据库ClickHouse...

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 暴走大数据点击右侧关注,暴走大数据! C ...

  3. ClickHouse基础知识及与MySQL性能对比

    文章目录 ClickHouse介绍 如何理解OLTP和OLAP 如何理解行式存储和列式存储 ClickHouse应用场景 ClickHouse引擎 Log系列引擎 MergeTree系列表引擎 Col ...

  4. 开源OLAP数据库ClickHouse获2.5亿美元B轮融资

    整理 | 祝涛 出品 | CSDN(ID:CSDNnews) ClickHouse宣布获得2.5亿美元B轮融资,估值已达20亿美元. 此次投资由Coatue和Altimeter牵头,Index Ven ...

  5. 802.11ax分析1---IEEE 802.11ax和IEEE 802.11ac性能对比

    本文源自Adian Fatvhur Rochim作者的Performance comparison of wireless protocol IEEE 802.11ax vs 802.11ac论文,我 ...

  6. ClickHouse 挺快,esProc SPL 更快

    开源分析数据库ClickHouse以快著称,真的如此吗?我们通过对比测试来验证一下. ClickHouse vs Oracle 先用ClickHouse(简称CH).Oracle数据库(简称ORA)一 ...

  7. 开源关系型数据库架构

    前言 我们把主要的开源关系型数据库分为三类,来分别了解一下它们的架构和设计,并了解一下它们各自的优缺点. OLTP,在线事务处理,是传统的关系型数据库的主要应用场景 OLAP,在线分析处理,是当今大数 ...

  8. 为什么ClickHouse分析数据库这么强?(原理剖析+应用实践)

    ClickHouse简介 2020年下半年在OLAP领域有一匹黑马以席卷之势进入大数据开发者的领域,它就是ClickHouse.在2019年小编也曾介绍过ClickHouse,大家可以参考这里进行入门 ...

  9. 你究竟有多了解开源?InfoQ《中国开源发展研究分析 2022 》发布

    | 转载自:InfoQ | 设计:冯歆怡 | 编辑:李佳阳 | 责编:王玥敏 除了登录平台账号使用开源代码,为开源社区做文档.代码层面的贡献,我们究竟能有多了解开源?或者说,作为见证了中国开源崛起的一 ...

最新文章

  1. 智能车竞赛技术报告 | 单车拉力组 - 哈尔滨工业大学 - 紫丁香
  2. rap 接口管理 java_有没有类似阿里rap的api管理方案(rap太卡了)
  3. APUE读书笔记-16网络通信-08非阻塞和异步IO
  4. ORA-29275:部分多字节字符
  5. [SpringBoot2]容器功能_底层注解配置绑定_@Configuration@Import@Conditional@ImportResource
  6. 深度好文:2018 年 NLP 应用和商业化调查报告
  7. linux执行命令提示缺少so,Linux软件缺少动态链接库.so怎么办
  8. 旋转成分矩阵结果分析_PCA(主成分分析) 和 SVD (奇异值分解)
  9. oracle的globalname后缀,在Oracle 11g下查看数据库的global_name
  10. Python 工匠: 异常处理的三个好习惯
  11. saas商业级的小程序商城(已开源)
  12. 最速下降法python_算法最优化之最速下降法
  13. 【软考 系统架构设计师】软件架构设计⑦ 构件与中间件技术
  14. java在线观看(jav在线网站)
  15. vue 基于elementUI、sortablejs的表格拖拽排序
  16. 台式计算机选购,电脑什么配置好 教你如何选购一台好的台式电脑
  17. java 画图 例子_JAVA简易画图工具
  18. 定时任务的corn表达式
  19. 进程间的通信方式 8种
  20. c++——ignore()函数

热门文章

  1. RocketMQ学习笔记(8)----RocketMQ的Producer API简介
  2. 【音乐随想】道,流浪者之歌 与神思者
  3. 萨拉萨蒂-《流浪者之歌》
  4. 数据库内连接与外连接
  5. C++实现约分(化简比)
  6. 第2章 荣格——分析心理学
  7. 晶体管图示仪曲线追踪扫描仪 IV曲线CV曲线伏安特性
  8. 简版:读、实践《动手学深度学习》
  9. 选择虚拟主机需要注意的
  10. [BSidesCF 2020]Had a bad day 1