gpt4 book ai didi

clickhouse - 如何理解ClickHouse中的粒度和 block ?

转载 作者:行者123 更新时间:2023-12-03 15:55:19 25 4
gpt4 key购买 nike

这两个词我不是很清楚。
一个区块的行数是否固定?
从磁盘读取的最小单位是否为一个块?
不同的块是否存储在不同的文件中?
一个块的范围是否大于颗粒?这意味着,一个块可以有多个颗粒跳过索引。

最佳答案

https://clickhouse.tech/docs/en/operations/table_engines/mergetree/#primary-keys-and-indexes-in-queries

主键是稀疏的。默认情况下,它包含每 8192 行的 1 个值(= 1 个颗粒)。

让我们禁用自适应粒度(用于测试)--index_granularity_bytes=0

create table X (A Int64) 
Engine=MergeTree order by A
settings index_granularity=16,index_granularity_bytes=0;

insert into X select * from numbers(32);

index_granularity=16 -- 32 行 = 2 granule ,主索引有 2 个值 0 和 16
select marks, primary_key_bytes_in_memory from system.parts where table = 'X';
┌─marks─┬─primary_key_bytes_in_memory─┐
│ 2 │ 16 │
└───────┴─────────────────────────────┘

16 字节 === INT64 的 2 个值。

自适应索引粒度意味着粒度大小不同。因为宽行(许多字节)需要(为了性能)较少(<8192)行颗粒。

index_granularity_bytes = 10MB ~ 1k row * 8129. 所以每个颗粒有 10MB。如果行大小为 100k(长字符串),那么 granule 将有 100 行(不是 8192)。

Skip index granules GRANULARITY 3 -- 表示一个索引将为每 3 个表粒度存储一个值。
create table X (A Int64, B Int64, INDEX IX1 (B) TYPE minmax GRANULARITY 4) 
Engine=MergeTree order by A
settings index_granularity=16,index_granularity_bytes=0;

insert into X select number, number from numbers(128);

128/16 = 8,table 有 8 个颗粒,INDEX IX1 存储 2 个 minmax (8/4) 值

所以 minmax 索引存储 2 个值——(0..63) 和 (64..128)

0..63 -- 指向前 4 个表的粒度。

64..128 -- 指向第二个 4 表的颗粒。
set send_logs_level='debug'
select * from X where B=77
[ 84 ] <Debug> dw.X (SelectExecutor): **Index `IX1` has dropped 1 granules**
[ 84 ] <Debug> dw.X (SelectExecutor): Selected 1 parts by date, 1 parts by key, **4 marks** to read from 1 ranges

SelectExecutor 检查跳过索引 - 可以跳过 4 个表粒度,因为 77 不在 0..63 中。
并且必须读取另外 4 个颗粒( 4 个标记 ),因为 (64..128) 中有 77 个——其中一些 4 个颗粒的 B=77。

关于clickhouse - 如何理解ClickHouse中的粒度和 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60255863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com