系统运维系列 之Clickhouse查询优化问题记录整理

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统运维系列 之Clickhouse查询优化问题记录整理相关的知识,希望对你有一定的参考价值。

ClickHouse 2016年开源的,由俄罗斯IT公司Yandex开发,是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),而且查询性能优越。

主要特点:
面向列+向量执行;
自己管理存储(非Hadoop);
线性可扩展,高可靠(通过shard+replication实现);
DDL(数据定义语言):可以动态地创建、修改或者删除数据库、表和视图,而无需重启服务;
DML(数据操作语言):可以动态地查询、插入、修改或删除数据;
权限控制:可以按照用户粒度设置数据库或者表的操作权限,保障数据的安全性。

使用的场景:单表分析,这个表可以很宽。

不足:
update or delete支持较弱;
不擅长根据主键按行粒度进行查询(虽然支持),所以不应该把 ClickHouse 当做键值对数据库使用。
总原则:能够提前过滤,一定要提前过滤。

1 列裁剪与分区裁剪:
数据量太大时应避免使用 select * 操作,查询的性能会与查询的字段大小和数量成线性表换,字段越少,消耗的 io 资源越少,性能就会越高。

// 反例
select * from datasets.test;
// 正例
select test1,test2,test3,test4,test5 from datasets.test;

分区裁剪就是只读取需要的分区,在过滤条件中指定。

select test1,test2,test3,test4,test5 from datasets.test where test1='2022-03-23';

2 order by 结合 where、limit:
千万以上数据集进行 order by 查询时需要搭配 where 条件和 limit 语句一起使用。

// 正例
select test1,test2,test3,test4,test5 from datasets.test where test1='2022-03-23' order by test2 desc limit 1000;
// 反例
select test1,test2,test3,test4,test5 from datasets.test order by test2 desc;

3 避免构建虚拟列:
如非必须,不要在结果集上构建虚拟列,虚拟列非常消耗资源浪费性能,可以考虑在前端进行处理,或者在表中构造实际字段进行额外存储。

// 反例
select test1,test2,test1/test2 as result,test3,test4,test5 from datasets.test;
// 正例:拿到test1和test1后,考虑在前端进行处理,或者在表中构造实际字段进行额外存储
select test1,test2,test3,test4,test5 from datasets.test;

4 大小表 JOIN:
多表 join 时要满足小表在右的原则,右表关联时被加载到内存中与左表进行比较,ClickHouse 中无论是 Left join、Right join 还是 Inner join 永远都是拿着右表中的每一条记录到左表中查找该记录是否存在,所以右表必须是小表。

5 数据类型:
建表时能用数值型或日期时间型表示的字段,就不要用字符串——全String类型在以Hive为中心的数仓建设中常见,但CK环境不应受此影响。
虽然clickhouse底层将DateTime存储为时间戳Long类型,但不建议直接存储Long类型,因为DateTime不需要经过函数转换处理,执行效率高、可读性好。

参考资料:
https://wenku.baidu.com/view/8e23b03056270722192e453610661ed9ad51551c.html clickhouse踩坑记录
https://blog.csdn.net/clearlxj/article/details/121851727 ClickHouse-查询优化
https://blog.csdn.net/shouwantao3369/article/details/117674172 Clickhouse查询优化问题记录
https://blog.csdn.net/abcd1101/article/details/55225920 sql执行顺序以及on和where的区别
https://blog.csdn.net/weixin_32842959/article/details/113514220 mysql先where再join_sql(join on 和where的执行顺序)
https://segmentfault.com/a/1190000039719297 ClickHouse的入门、使用和优化
https://www.cnblogs.com/traditional/p/15218565.html ClickHouse 的基本介绍,什么是 ClickHouse?

以上是关于系统运维系列 之Clickhouse查询优化问题记录整理的主要内容,如果未能解决你的问题,请参考以下文章

系统运维系列 之Clickhouse数据类型整理

系统运维系列 之Clickhouse数据类型整理

系统运维系列 之Clickhouse数据库学习集锦(增删改查操作)

系统运维系列 之Clickhouse数据库学习集锦(增删改查操作)

系统运维系列 之MySQL部分学习整理1

系统运维系列 之Kafka查询不到正在消费的的消费组信息