【clickhouse踩坑记录】ClickHouse查询性能优化(入门级)

本文介绍了如何针对ClickHouse进行性能优化,包括表级别优化(如填充空值、分区存储与索引、索引粒度调整)、语法优化(如count优化、谓词下推、聚合外推、使用高级函数)和查询优化(prewhere代替where、列裁剪与分区裁剪、避免构建虚拟列、使用IN代替JOIN、大表关联小表)。通过这些方法,可以显著提升ClickHouse的查询效率。

背景

用了一年多的ClickHouse,但好像都没系统地去学一遍,趁着最近有点时间,相对全面地去看了一圈ClickHouse的内容。发现ClickHouse虽然性能查询本身快,但如果使用不恰当,性能会被降一个级别。下面主要简单介绍一下,ClickHouse的查询可以从哪些方面做优化。可重点关注标题加粗部分!!

优化方法

以下,主要从表级别、语法、查询这三方面简要介绍。

表级别优化

  1. 填充有空值的字段

    对于一些表字段,若存在空值,则可以考虑使用无业务场景意义的字符进行填充。因为ClickHouse对于空值,在底层存储是用了单独的文件存储。相对于没有空值的情况,存在空值会稍微影响查询性能。

  2. 分区存储与索引

    这部分属于相对常规的操作啦。跟hive一样,表分区后,底层也会有相关的分区目录,筛选的时候添加分区过滤,提升查询性能。
    另一部分是索引,即建表语句中的order by,对于涉及到筛选的字段,按由粗到细的粒度对表进行排序,查询性能也可以有一定的提升。

  3. 索引粒度

    index_granularity:这个参数是稀疏索引的粒度,默认是8192。正常情况是不用修改,官方也不建议。除非遇到大量的数据(上亿级别)且分布不均的时候,可以调整此参数。

语法优化

  1. count优化

    因为clickhouse对每个表的数据量,在底层文件中提供了预数据。所以能直接使用count()则避免使用count(col_name)。

  2. 谓词下推

    常规操作啦,也就是存储在子查询的话,将where条件挪到子查询中,提前过滤,避免过多的数据加载到内存中。

  3. 聚合外推

    举个例子:如将sum(money * 2) 变成 sum(money) * 2。对数据库来说,后者的计算量明显少一点。

  4. 高级函数

    ClickHouse中有很多很好用的

评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值