ClickHouse 21.7.3.14-2(十) 查询优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ClickHouse 21.7.3.14-2(十) 查询优化相关的知识,希望对你有一定的参考价值。

参考技术A

Prewhere 和 where 语句的作用相同,用来过滤数据。不同之处在于 prewhere 只支持 *MergeTree 族系列引擎的表,首先会读取指定的列数据,来判断数据过滤,等待数据过滤之后再读取 select 声明的列字段来补全其余属性。

当查询列明显多于筛选列时使用 Prewhere 可十倍提升查询性能,Prewhere 会自动优化执行过滤阶段的数据读取方式,降低 io 操作。

在某些场合下,prewhere 语句比 where 语句处理的数据量更少性能更高。

默认情况,我们肯定不会关闭 where 自动优化成 prewhere,但是某些场景即使开启优化,也不会自动转换成 prewhere,需要手动指定 prewhere:

通过采样运算可极大提升数据分析的性能

采样修饰符只有在 MergeTree engine 表中才有效,且在创建表时需要指定采样策略。

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

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

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

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

性能可提升 10 倍以上,uniqCombined 底层采用类似 HyperLogLog 算法实现,能接受 2%左右的数据误差,可直接使用这种去重方式提升查询性能。Count(distinct) 会使用 uniqExact 精确去重。

不建议在千万级不同数据上执行 distinct 去重查询,改为近似去重 uniqCombine

为了避免因个别慢查询引起的服务雪崩的问题,除了可以为单个查询设置超时以外,还可以配置周期熔断,在一个查询周期内,如果用户频繁进行慢查询操作超出规定阈值后将无法继续进行查询操作。

物理内存和虚拟内存的数据交换,会导致查询变慢,资源允许的情况下关闭虚拟内存。

为每一个账户添加 join_use_nulls 配置,左表中的一条记录在右表中不存在,右表的相应字段会返回该字段相应数据类型的默认值,而不是标准 SQL 中的 Null 值。

批量写入数据时,必须控制每个批次的数据中涉及到的分区的数量,在写入之前最好对需要导入的数据进行排序。无序的数据或者涉及的分区太多,会导致 ClickHouse 无法及时对新导入的数据进行合并,从而影响查询性能。

cpu 一般在 50%左右会出现查询波动,达到 70%会出现大范围的查询超时,cpu 是最关键的指标,要非常关注。

clickhouse的多表关联会把有表的数据全部加入到内存中,然后左表每条去和内存中的数据做对比。一旦左表数据量过大,容易导致内存不够。

当多表联查时,查询的数据仅从其中一张表出时,可以考虑用 IN 操作而不是 join。

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

ClickHouse 在 join 查询时不会主动发起谓词下推的操作,需要每个子查询提前完成过滤操作,需要注意的是,是否执行谓词下推,对性能影响差别很大(新版本中已经不存在此问题,但是需要注意谓词的位置的不同依然有性能的差异)

两张分布式表上的 IN 和 JOIN 之前 必须加上 GLOBAL 关键字 ,右表只会在接收查询请求的那个节点查询一次,并将其分发到其他节点上。如果不加 GLOBAL 关键字的话,左分布式表的每个节点都会单独发起一次对右表的查询,而右表又是分布式表,就导致右表一共会被查询 N²次(N是该分布式表的分片数量),这就是查询放大,会带来很大开销。

将一些需要关联分析的业务创建成字典表进行 join 操作,前提是字典表不宜太大,因为字典表会常驻内存, 官方地址

通过增加逻辑过滤可以减少数据扫描,达到提高执行速度及降低内存消耗的目的

以上是关于ClickHouse 21.7.3.14-2(十) 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

大数据ClickHouse:数据类型详细介绍

Spark+ES+ClickHouse 构建DMP用户画像

大数据ClickHouse(十五):ClickHouse SQL语法之DDL 操作讲解

Clickhouse:按与表存储相同的顺序排列内存耗尽

最近很火的 ClickHouse列式数据库 是什么?

clickhouse在风控-风险洞察领域的探索与实践