ClickHouse 在什么场景下才管用?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: ClickHouse 是一款以速度快著称的分析型数据库,尤其在列式宽表遍历方面表现出色。然而,面对复杂查询和关联运算时,ClickHouse 的性能急剧下降,甚至无法执行某些任务。相比之下,esProc SPL 通过更简洁的 SPL 语法和强大的优化能力,在各种复杂场景下均表现出色,全面超越 ClickHouse。实际案例显示,esProc SPL 在处理大规模数据时,性能提升可达数十倍。

ClickHouse 是近年来分析型数据库的热点,一向以快著称,很多其它以性能为卖点的分析型数据库也常常会用它作为一个对比标杆。很多用户碰到数据库运算性能问题时,也会考虑转向求助于 ClickHouse 解决
ClickHouse 确实是有过人之处,它的列式宽表速度很快,估计是压缩做得非常好。然而,除此之外,再无长处。希望用 ClickHouse 解决数据库计算性能问题的用户,大概率会失望的。

我们先拿 TPCH 100G 来测试 ClickHouse,在同样的硬件环境下和 Oracle 对比,这里只列出一个结果(时间单位:秒),完整的测试报告在 SPL 计算性能系列测试:TPCH 。
QQ_1729568367880.png
TPCH 算是比较基础的数据库性能测试,总体来讲不算很复杂,但也包含了一些 JOIN 和子查询,不全是简单的单表遍历。这情况下,ClickHouse 的表现非常差,有相当多的题跑不出来,还有个别题的 SQL 被认为过于复杂而无法执行。这方面甚至还不如 Oracle,Oracle 不是专业分析型数据库,速度会慢很多,但所有题都能跑出来。
具体原因很可能如上所述,ClickHouse 仅仅是把数据存储压缩做得很好,这会导致简单遍历速度很快,但对稍复杂的运算,它的优化能力相当拉胯,结果直接跑不出来。
希望用 ClickHouse 解决性能问题的用户,要先考察一下自己面临的计算任务的复杂度和 TPCH 相比如何。

我们继续用这套 TCPH 数据生成一个多列的宽表,再做 ClickHouse 最为擅长的多维分析计算,结果如下(时间单位:秒),完整测试报告见 SPL 计算性能系列测试:关联表及宽表 。
QQ_1729568402059.png
宽表遍历是 ClickHouse 擅长的场景,性能最好。但只要有多一点关联,ClickHouse 的运算性能就会急剧下降。关联再复杂后又会溢出,再一次验证了上述的原因分析。
看来,ClickHouse 的“快”,仅仅在于最简单的无关联单表遍历,这种“快”能适应的场景实在是太狭窄了。专门引进一个数据库仅仅做这么一点点事情,值得吗?

相比 ClickHouse 的“徒有虚名”,上面测试报告中提到的 esProc SPL 才是性能王者。

esProc SPL 也是开源软件,它是纯 Java 开发的,但在相当多的性能优化场景中却能远远跑赢 C++ 开发的 ClickHouse。
严格地说,esProc 并不是一个分析型数据库,不过它提供了高性能的存储格式(列存、压缩等)和相应的算法类库,可以完全取代分析型数据库的计算功能。
和市场上其它与 ClickHouse 竞争的数据库产品不同,esProc 没有再使用 SQL 语法,而是采用了更简洁的 SPL。这样才能克服 SQL 的缺陷,实现 SQL 难以甚至无法实现的高性能算法。这里有通俗的解释 快出数量级的性能是怎样炼成的 。而继续采用 SQL 体系的数据库,即便在某些局部能超越 ClickHouse,但仍然会受到 SQL 的局限,无法充分利用硬件资源跑出最好的性能。

我们再再把刚才测试报告中 esProc SPL 的性能列出和 ClickHouse 对比:
QQ_1729568434690.png
结果,esProc SPL 表现出来的性能明显优于 ClickHouse,所有题都能很快跑出来,对 ClickHouse 有全面的碾压优势。
QQ_1729568460922.png
数据量加大后,ClickHouse 在擅长的单个宽表遍历场景中确实更胜一筹,比 esProc SPL 更快。不过,大多数情况下采用宽表是为了规避低速的关联运算(以更大的存储量和更复杂的数据准备换取不做关联),而 esProc SPL 特有的关联优化方案能够跑出比 ClickHouse 宽表更快的速度,没有必要再生成宽表了。宽表丧失性能优势后,就只剩缺点,纯属多余。

对于单表上的无关联简单统计,ClickHouse 虽然更快,但也没有比 esProc 快出数量级(毕竟 CPU 和硬盘的动作就是那么快)。如果这时候可以利用任务特征来优化时,基于 ClickHouse 仍然会很难搞,SQL 无法实现很多优化逻辑,只能在上层用 C++ 继续编程才能实现,非常繁琐且困难。而 SPL 的可编程能力要强大得多,可以充分利用任务特征写出优化代码。
比如现代多维分析时几乎总会涉及到多指标统计,SPL 可以写出遍历复用算法,一次遍历计算出多个统计值,即便单指标计算比 ClickHouse 稍慢,多指标统计时就能大幅超出:
QQ_1729568483090.png
(完整测试报告 SPL 计算性能系列测试:多指标统计 )

对于更复杂的运算,比如漏斗运算,其复杂度已经无法再用 ClickHouse 做测试了,esProc SPL 当然不在话下 SPL 计算性能系列测试:漏斗分析 。
总结一下:esProc SPL 的性能优势是全面综合的,ClickHouse 的性能优势仅对一个非常狭窄的领域有效。

举个实际的案例,某个时空碰撞问题,总数据量约 250 亿行。SQL 看起来并不算很复杂:

WITH DT AS ( SELECT DISTINCT id, ROUND(tm/900)+1 as tn, loc FROM T WHERE tm<3*86400) SELECT * FROM ( SELECT B.id id, COUNT( DISINCT B.tn ) cnt FROM DT AS A JOIN DT AS B ON A.loc=B.loc AND A.tn=B.tn WHERE A.id=a AND B.id<>a
GROUP BY id )
ORDER BY cnt DESC
LIMIT 20
传统数据库跑得太慢,用户转而求助于 ClickHouse,结果用了 5 节点的集群环境下也跑了 30 分钟多,达不到期望。同样数据量,SPL 代码只用一个节点不到 6 分钟即可完成计算,超出了用户期望。考虑到硬件资源的差距,SPL 相当于比 ClickHouse 快了 25 倍以上。
QQ_1729568509162.png
(SPL 代码写在格子里,这和普通程序语言很不像,参考这里 写在格子里的程序语言 )

SQL 中的 DISTINCT 计算会涉及 HASH 和比对,数据量很大时计算量也会很大,然后还有自关联以及进一步的 COUNT(DISTINCT),都会严重拖累性能,而 SPL 可以充分利用 SQL 没有的有序分组和序号定位,有效避免复杂度很高的自关联和 DISTINCT 运算。虽然在存储效率上比 ClickHouse 并没有优势,Java 也会略慢于 C++,但仍然获得了数量级的性能提升。

最后,esProc SPL 到这里找:https://github.com/SPLWare/esProc。

相关文章
|
5天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
7天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1560 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
11天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
723 27
|
7天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
223 3
|
14天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
747 5
|
2天前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
107 60
|
1天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
113 1
|
3天前
|
Java 开发者
【编程进阶知识】《Java 文件复制魔法:FileReader/FileWriter 的奇妙之旅》
本文深入探讨了如何使用 Java 中的 FileReader 和 FileWriter 进行文件复制操作,包括按字符和字符数组复制。通过详细讲解、代码示例和流程图,帮助读者掌握这一重要技能,提升 Java 编程能力。适合初学者和进阶开发者阅读。
102 61
|
14天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】