利益相关: OLAP查询引擎开发者,TPC-H 30TB榜单排名第一的系统的开发者之一。
先放结论: Clickhouse没有任何吊炸天的优化,它只是把论文和社区中大家都讨论过的那些优化技巧,很好地实现了一下而已。(本回答只讨论查询链路)
谈起数据库查询引擎或者大数据执行引擎,你一定听说过这些关键词:向量化、列式执行、SIMD、LLVM等等等。每个人都会讨论这些,但是很少有人能够把这些东西讲的很透彻。现在大部分生产用的查询引擎,还是最原始的火山模型那一套,顶多带个并行查询和LLVM-based code generation。很多产品都在PR稿子中宣传自己实现了向量化之类的技术、然后放个demo的测试结果,但是基本上经不起推敲。如果我们把现在所有讨论过的查询引擎优化技术的总分设定为100,那么大部分查询引擎只能得1分,clickhouse可以得30分。Clickhouse做的无非就是把这些技术一个一个地进行工程优化、实现到生产系统中。这不是我说的,这是clickhouse自己的文档说的[1]。
为什么会这样呢?我觉得是因为在数据库这个圈子,大家太在意一个概念是不是够新、算法是不是够优美,觉得“工程”是很trivial的东西。实际上,只需要招一些有性能优化、HPC经验的工程师做些简单分析,就能找到查询引擎的性能瓶颈,然后照着之前大家讨论过的那些概念去实现就好了。但是这东西不能上PPT、也不能发论文,所以在意的人不多。
举个例子,内存分配。很多人可能都做过系统内存分配的优化,大家一讨论内存分配都是tcmalloc之类的高大上得词。但是在OLAP查询引擎里,执行引擎是迭代式的、生成大量的中间结果。比如某个算子需要不断生成很多个长度20字节的内存块。实际上开发的时候只需要一次分配个16KB的内存、然后一块一块的去切,问题就解决了。这只是一个很小的开发技巧,不需要任何高大上的算法。
再举个例子,很多论文讨论用LLVM之类的代码生成工具去完整地生成一颗查询树的代码。有这个想法的人肯定没基于LLVM做过开发。先不说性能是否有优势,纯粹用LLVM开发复杂工程的工程难度是指数级别的,现实中不可实现。早在2011年的一篇文章,这个问题就已经有了结论[2],但是现在学术圈还是讨论这个概念。
Clickhouse就是典型的不管概念是否听起来炫酷、只在乎性能的产品。比如clickhouse的hash agg,用模板实现了30多个版本,覆盖了最常见的group key的类型。这么做的目的就是为了减少一些类型判断的时间。Clickhouse的性能,就是大量类似的工程优化堆积起来的。
当然clickhouse也有缺陷。从我自己做过的测试来看,clickhouse主要关注单表优化,不能很好地处理复杂表达式和多表join的场景,而且在需要落盘的场景clickhouse也没有做过很好的优化。有些原因是clickhouse没有在这个点上花太多功夫,有些原因则是clickhouse的列式架构本身的限制。
下一个五年,希望自己能够有机会做出clickhouse这样的产品。
对了,clickhouse默认开8线程,当然快。
[2] Sompolski, Juliusz, Marcin Zukowski, and Peter Boncz. "Vectorization vs. compilation in query execution." InProceedings of the Seventh International Workshop on Data Management on New Hardware, pp. 33-40. 2011.
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有