① ClickHouse建表的时候每个字段加上默认值,或者建表的时候加上Nullable约束(这里不建议加约束,主要是ClickHouse针对他的字段类型做了很多优化,加这样的约束以后,可能就在底层不管是存储还是元数据方面的话其实都是会有一些优化没有用上)。
② Flink sql在处理数据时,加上coalesce空值处理函数。
9. ClickHouse查询优化
接下来我们谈一谈ClickHouse能做查询优化的一些地方。
① 选择适合的merge引擎。包括更新场景或者小量的log日志引擎,根据不同场景都能选到比较合适的一种merge引擎,这个大家可以翻看一下CK的官网,对各个引擎说的都非常的详细。
② 做好分区的分级,一级分区二级分区,不过我们现在不太建议用二级分区,因为它的order by这种索引足够优秀了,最好是在分区数和分区内的parts之间取一个平衡。如果是实时写parts数的话可能前几天的数据会merge 的比较好但是实时(今天)这一天的数据可能parts数太多的话查询起来就会比较慢。
③ 根据SQL数据特性,按照字段order by排序,跟MySQL这边一样要根据查询的SQL想好怎么设计一个order by的字段排序,包括命中数,都是有学问在里面的,就看它的一个分类性和整个分类字段的话到底在这个表里面大概是一个什么样的颗粒度。
大查询spill to disk:这个我们现在已经有部分集群在给有超大查询需求的AD-Hoc这种场景跟它对应。我们拿出一两个presto集群去开了spill to disk集群来用,后续我们也会结合智能路由,智能分辨执行计划里面读的表源数据非常大的话,就直接给它丢到这个spill to disk集群里。