优化索引粒度参数提升ClickHouse查询性能

当对高基数列进行过滤查询时,总是希望尽可能跳过更多的行。否则需要处理更多数据、需要更多资源。ClickHouse缺省在MergeTree表读取8192行数据块,但我们可以在创建表时调整该index_granularity 参数。本文通过示例说明如何调整该参数优化查询性能。

index_granularity 参数默认值

下面示例,创建表并插入1亿条记录,从1到100M-1:

CREATE TABLE deleteme
(
    `number` UInt64
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number AS
SELECT number 
FROM numbers(100000000)

下面过滤行,条件为10000倍数的行:

SELECT *
FROM deleteme
WHERE number IN (
    SELECT number * 10000
    FROM numbers(100000)
)
FORMAT `Null`

Query id: 11412bc3-05de-4790-9b65-06b139761e0c

Ok.

0 rows in set. Elapsed: 1.211 sec. Processed 100.00 million rows, 800.00 MB (82.56 million rows/s., 660.45 MB/s.)

这里使用 FORMAT Null,我们仅想了解查询性能,无需返回结果。可以看到扫描了全表,这是因为index_granularity 默认为8192,大约10000行,意味着读所有数据块,大小800MB。

计算过程大概为,首先确定数据在哪个块,因为默认8192,因此所有块都有我们需要的数据。进入具体某个块之后再次采用二分法进行查找,虽然算法选择正确,但仍需要全表扫描。下面我们看减少index_granularity参数情况呢。

index_granularity=128

下面通过设置index_granularity=128,缩小处理数据量:

CREATE TABLE deleteme
(
    `number` UInt64
)
ENGINE = MergeTree
PARTITION BY number % 10
ORDER BY number
SETTINGS index_granularity=128 AS
SELECT number
FROM numbers(100000000)

下面运行上面相同查询:

SELECT *
FROM deleteme
WHERE number IN (
    SELECT number * 10000
    FROM numbers(100000)
)
FORMAT `Null`

0 rows in set. Elapsed: 0.785 sec. Processed 12.84 million rows, 102.73 MB (16.35 million rows/s., 130.81 MB/s.)

可以看到仅扫描了12.84百万行,仅102.73MB大小。极大地降低了查询时间和计算成本。因为粒度变小,自动跳过了很多数据块,具体到某个快时,数据量很小,查找速度自然很快,因此在这种场景下粒度小,查询速度更快。当然,调整index_granularity也会带来存储成本,索引会变大,因此插入变慢。有时读取较小的数据块并不能提升查询性能,这取决与查询方式。尽管如此index_granularity是一个很好的技巧,可以使提升查询性能。

总结

index_granularity参数默认为8192,在基数特别大的场景中,针对单条记录查询时,选择较低的index_granularity参数值,会有效提升查询性能。参考文档:Minimize processed bytes with index granularity | ClickHouse Knowledge Base (tinybird.co)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClickHouse 是一个高性能、高可靠性的开源列式数据库管理系统,它主要用于处理海量数据并进行快速分析。在使用 ClickHouse 进行数据查询时,可以通过以下几种方式进行优化: 1. 数据模型设计优化:在设计数据模型时,需要考虑到数据的存储方式和访问模式。例如,可以将频繁查询的字段放置在表的前面,以提高查询速度;可以使用合适的数据类型来减少数据的存储空间,从而提高查询性能。 2. 索引优化ClickHouse 支持多种类型的索引,例如普通索引、主键索引、排序键索引等。在创建索引时,需要根据数据的特点选择合适的索引类型,并设置合适的索引参数。 3. 查询优化:在编写查询语句时,应该避免使用复杂的子查询和多重嵌套,这会使查询变得缓慢。可以使用 ClickHouse 提供的 Explain 命令来分析查询语句的执行计划,从而找出性能瓶颈,并进行优化。 4. 数据分区优化:在处理大量数据时,可以将数据进行分区,以便进行更快速的查询。可以根据数据的时间、地理位置等特征进行分区,从而提高查询性能。 5. 硬件优化ClickHouse 对硬件的要求较高,需要使用高速的存储设备和足够的内存。可以通过增加存储设备的数量、使用 SSD 等方式来提高性能。 总之,在使用 ClickHouse 进行数据查询时,需要综合考虑多个方面的因素,进行全方位的优化,以实现更快速、更高效的数据查询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值