一说到 ClickHouse 的快,谈的最多的是它的向量化执行,而在最近一次 ClickHouse Meetup 中,ClickHouse 团队的 Maksim Kita 为我们带来了关于JIT 优化的分享。
其实在 ClickHouse 中,有同时用到向量化执行和 JIT (just-in-time compilation) 的。
JIT 带来的好处很多,例如:
1. 有助于提升L1、L2缓存命中
2. 减少执行的代码
3. 更好的利用编译器优化
4. 直接使用目标CPU指令
等等
既然提到的好处这么多,说的我都想跃跃欲试了,接下来就让我们就看看 JIT 是否能够提升性能吧。
例如执行下面的语句,并开启JIT:
SELECT a + b + c FROM test_jit
settings min_count_to_compile_expression=1,compile_expressions=1;
日志中会多出一段 JIT 的内容:
<Trace> ExpressionJIT: Compile expression plus(plus(UInt64, UInt64), UInt64)
这是将表达式部分,原本的 DAG 进行了优化:
咱们继续验证,执行下面的语句,强制关闭JIT:
SELECT
number * 2 +
number * 3 +
number * 4 +
number * 5
FROM numbers(10000000)
FORMAT Null
settings min_count_to_compile_expression=1,compile_expressions=0;
Query id: 2bf9d8a4-d7cb-4691-9246-b890dd0f1b36
Ok.
0 rows in set. Elapsed: 0.055 sec. Processed 10.02 million rows, 80.18 MB (180.95 million rows/s., 1.45 GB/s.)
然后开启JIT,再执行一次:
SELECT
number * 2 +
number * 3 +
number * 4 +
number * 5
FROM numbers(10000000)
FORMAT Null
settings min_count_to_compile_expression=1,compile_expressions=1;
Query id: 154a0af2-bd62-4ab6-89bb-dbebafce16eb
Ok.
0 rows in set. Elapsed: 0.016 sec. Processed 10.02 million rows, 80.18 MB (630.94 million rows/s., 5.05 GB/s.)
对比上面上次查询的效率:
开启 JIT 是 (630.94 million rows/s., 5.05 GB/s.)
关闭 JIT 是 (180.95 million rows/s., 1.45 GB/s.)
两者相差 3.5 倍,提效确实很明显。
好了,现在总结一下:
好了,今天的分享就到这里吧,原创不易,如果这篇文章对你有帮助,欢迎 点赞、转发、在看 三连击
本文分享自 ClickHouse的秘密基地 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!