来和我一起挑战吧:ClickHouse vs. Databricks & Snowflake丨第 1 部分

图片

本文字数:4461;估计阅读时间:12 分钟

作者:Al Brown and Tom Schreiber

来和我一起挑战吧:ClickHouse vs. Databricks & Snowflake丨第 1 部分

图片

摘要(TL;DR)

我们选择了一个公开的基准测试,它用来检验在 Databricks 和 Snowflake 上执行大量 join 的 SQL 查询,然后在 ClickHouse Cloud 上跑了同样的查询对比。

在 7.21 亿行到 72 亿行的各个规模下,ClickHouse 都展现出更快、性价比更高的优势。

“ClickHouse 不能做 join”?那我们就来验证一下

先说清楚:这个基准并不是我们自己设计的。

这套以咖啡店为主题的基准测试由其他人提出,旨在比较 Databricks 和 Snowflake 在不同计算规模下执行大量 join 查询时的性能和成本。作者也把完整的数据集和查询脚本都公开了。

出于好奇,我们直接采用相同的基准,把数据加载进 ClickHouse Cloud,使用接近的实例规模,并跑了原始的 17 条查询。大部分查询都包含 join,我们也没有做任何重写(只有查询 6、10、15 做了少量语法调整以兼容 ClickHouse SQL 方言)。

查询本身没有做任何调优,ClickHouse 侧也没有任何表结构、索引或参数的修改。

下次有人再说“ClickHouse 不能做 join”,就把这篇文章甩给他们看。

过去半年里,我们大幅优化了 ClickHouse 的 join 性能[https://youtu.be/gd3OyQzB_Fc?si=Fso5oedhSHYYW16L&t=137],这篇文章就是你第一次见证我们取得的进展。(剧透一下:真的很快,也很便宜,而且这还只是开始。)

接下来我们会一步一步介绍如何运行这套基准,你也可以自己动手试试,并且会详细展示三个数据规模(7.21 亿、14 亿、72 亿行)的完整测试结果。

最后总结一句:ClickHouse 能做 join,而且做得很快。

如何复现

你可以在这个 GitHub 仓库[https://github.com/sdairs/coffeeshop-benchmark/tree/main]里找到所有信息,包括 17 条查询、脚本和说明文档。我们还把完整数据集放进一个公开的 S3 bucket[https://github.com/sdairs/coffeeshop-benchmark/tree/main?tab=readme-ov-file#get-the-data],所以你可以直接跳过生成数据这一步,马上开始测试。

整个流程都是自动化的:启动 ClickHouse Cloud 服务,通过环境变量设置凭据,然后使用你的集群规格和每计算单元价格执行一个命令即可。

点一下,喝口咖啡,结果就出炉了。

我们每条查询会跑 5 次,并选取最快的一次来反映缓存命中状态下的性能。你可以查看完整结果[https://github.com/sdairs/coffeeshop-benchmark/tree/main/clickhouse-cloud/results]。

一个数据集,多种运行方式:我们的规模化基准方法

为了加快基准测试的效率,我们使用了 ClickHouse Cloud 中的 Warehouses 功能[https://clickhouse.com/blog/introducing-warehouses-compute-compute-separation-in-clickhouse-cloud],它可以在同一个共享数据集上同时启动多个计算节点服务。

我们只需要一次性导入数据,然后在不同配置下启动多个服务,通过调整节点数、CPU 核心数以及内存,来测试不同的硬件组合和成本结构。

由于同一个 Warehouse 中的所有服务共享相同数据,我们就能在所有配置上同时跑完基准,而无需反复加载数据。

这也让我们得以测试 ClickHouse Cloud 的 Parallel Replicas 功能[https://clickhouse.com/docs/deployment-guides/parallel-replicas],通过多个计算节点并行执行一条查询,获得更快的响应。

基准结构

这套基准最早在 LinkedIn 上分成两部分发布(第 1 部分[https://www.linkedin.cn/incareer/pulse/databricks-vs-snowflake-sql-performance-test-day-1-721m-bogran-lsboe/]和第 2 部分[https://www.linkedin.cn/incareer/pulse/databricks-vs-snowflake-gen-1-2-sql-performance-test-day-bogran-ddmhe/]),使用模拟的全国咖啡连锁订单数据。主要针对事实表的三个数据规模进行测试:

Scale factor

Total rows in fact table (Sales)

5亿行

7.21 亿行

10亿行

14亿行

50亿行

72亿行

三个规模使用相同的三张表结构:

  • Sales:订单事实表

  • Products:产品维度表

  • Locations:门店/位置维度表

这份基准总共包含 17 条 SQL 查询[https://github.com/JosueBogran/coffeeshopdatageneratorv2/blob/2a99993b6bca94c0bc04fae7c695e86cd152add1/Performance%20Test%20Queries.sql],其中大多数涉及事实表与一个或两个维度表的 join,所有查询按顺序依次执行。

原始基准的第 1 部分覆盖了较小的 7.21 亿行数据量,第 2 部分则增加了 14 亿和 72 亿行的数据结果。

本篇文章保持原帖的整体结构和风格:相同的查询、相同的图表样式、相同的顺序,只是全部在 ClickHouse Cloud 上重新执行了一遍。针对每个数据规模,我们会报告:

  • 总成本(美元)

  • 总运行时长(秒)

  • 单条查询平均成本(不含 Q10 和 Q16)

  • 单条查询平均耗时(不含 Q10 和 Q16)

  • 单条查询成本(仅 Q10 和 Q16)

  • 单条查询耗时(仅 Q10 和 Q16)

由于查询 10 和查询 16 的耗时远高于其他查询,如果放在同一张图里会压缩其他结果的可读性,因此原始帖子将它们单独列出。

此外,原始基准中还提供了“Clustered”和“Non-clustered”两种版本(其中“Clustered”是指按物理排序并共置数据,以优化大表的查询效率)。为了保证一致性,我们这里仅报告 Clustered 版本的结果。

测试方法与环境

在原始基准测试中,所有结果都属于多次预热后的运行。我们也对每条查询执行 5 次,并报告其中最快的一次,以公平地反映缓存命中后的性能表现。

本文展示的所有结果均基于 ClickHouse Cloud 的 Scale 层,服务部署在 AWS 的 us-east-2 区域。完整测试中还包含 Enterprise 层的成本数据,与 Scale 层相比依然具备明显竞争力。

所有服务均运行 ClickHouse 25.4.1,且默认开启并行副本(Parallel Replicas)。

下面会呈现完整的图表,不再做额外说明,详细背景可参考原始 LinkedIn 帖子,最后我们也会总结出一个清晰的结论。

在下方图表中,ClickHouse Cloud 的测试结果使用这样的标签格式:CH 2n_30c_120g,含义如下:

  • 2n = 计算节点数量

  • 30c = 每节点 CPU 核心数

  • 120g = 每节点内存(GB)

所有服务配置均为每节点 30 核心、120 GB 内存,测试 4 种节点规模:2、4、8 和 16 个节点。

Databricks(例如 DBX_S)和 Snowflake(例如 SF_S_Gen2)的标签含义保持不变,详细解释可见原帖。

结果:500m 规模(7.21 亿行)

该规模以 5 亿条订单为原始数据生成 7.21 亿行记录。

总成本

图片

每根柱状图括号中同时展示 17 条查询的总运行时

总运行时间

图片

每根柱状图括号中同时展示 17 条查询的总成本

单条查询平均成本(不含 Q10 和 Q16)

图片

单条查询平均耗时(不含 Q10 和 Q16)

图片

Q10 和 Q16 查询的平均成本

图片

Q10 和 Q16 查询的平均耗时

图片

结果:1b 规模(14 亿行)

该规模以 10 亿条订单为原始数据生成 14 亿行记录。

总成本

图片

每根柱状图括号中同时展示 17 条查询的总运行时

总运行时间

图片

每根柱状图括号中同时展示 17 条查询的总成本

单条查询平均成本(不含 Q10 和 Q16)

图片

单条查询平均耗时(不含 Q10 和 Q16)

图片

Q10 和 Q16 查询的平均成本

图片

Q10 和 Q16 查询的平均耗时

图片

结果:5b 规模(72 亿行)

该规模以 50 亿条订单为原始数据生成 72 亿行记录。

总成本

图片

每根柱状图括号中同时展示 17 条查询的总运行时

总运行时间

图片

每根柱状图括号中同时展示 17 条查询的总成本

单条查询平均成本(不含 Q10 和 Q16)

图片

单条查询平均耗时(不含 Q10 和 Q16)

图片

Q10 和 Q16 查询的平均成本

图片

Q10 和 Q16 查询的平均耗时

图片

总结与展望

ClickHouse 在 join 场景下的表现非常优秀,跨越所有数据规模都表现出惊人的速度。

本次基准测试包含的 17 条查询,聚焦于贴近真实业务的 join 场景:涉及 2–3 张表,没有做任何调优或重写。我们就是想看看 ClickHouse 在原始状态下的实际水平。

  • 在 500m 规模下,大多数查询都能在 1 秒内跑完,ClickHouse 始终比其他方案快 3~5 倍,并且更省钱。

  • 在 1b 规模下,ClickHouse 仅用半秒就完成对 17 亿行数据的 join、聚合和排序,而其他系统需要 5 到 13 秒,且依旧更贵。

  • 在 5b 规模下,即使最重型的查询也能在几秒钟内完成,而不是几分钟,ClickHouse 依然是又快又省的最佳选择。

我们并没有做任何特别的操作,没有改配置,也没有专门的小技巧,只是干干净净地跑了一遍原始基准。

在接下来的第二部分,我们会演示通过几个我们手里的强力绝招,如何以 ClickHouse 方式把 join 性能真正推到极致。

在过去 6 个月里,我们持续深耕 ClickHouse 的 join 性能,无论是优化查询计划、内存效率,还是执行策略,都做了大幅改进。

而且这远远不够。

接下来,我们要把难度继续拉满:完整的 TPC-H 测试,挑战最多 8 表(8-way)连接。

想看看 ClickHouse 在最严苛 join 场景下的表现吗?敬请期待我们的 TPC-H 测试结果!

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值