Как понять гранулярность и блок в ClickHouse? - PullRequest
1 голос
/ 17 февраля 2020

Мне непонятно об этих двух словах. Есть ли в одном блоке фиксированное количество строк? Является ли один блок минимальным блоком для чтения с диска? Разные блоки хранятся в разных файлах? Является ли диапазон одного блока больше, чем гранулы? Это означает, что один блок может иметь несколько индексов пропуска гранул.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

https://clickhouse.tech/docs/en/operations/table_engines/mergetree/#primary -ключи-и-индексы в запросах

Первичный ключ разбирается. По умолчанию он содержит 1 значение из каждой 8192 строк (= 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 гранулы, первичный индекс имеет 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 байт === 2 значения INT64.

Адаптивный индекс гранулярности означает, что размер гранул различен. Поскольку широким строкам (много байтов) требуется (для производительности) меньше (<8192) строк в грануле. </p>

index_granularity_bytes = 10 МБ ~ 1k строк * 8129. Таким образом, каждая гранула имеет 10 МБ. Если размер строки 100k (long Strings), гранула будет иметь 100 строк (не 8192).


Пропуск гранул индекса 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, в таблице 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 отметки ), потому что 77 в (64..128) - некоторые из этих 4 гранул имеют B = 77.

0 голосов
/ 18 февраля 2020

https://clickhouse.tech/docs/en/development/architecture/#block

Блок может содержать любое количество строк. Например, 1 ряд блоков:

set max_block_size=1;
SELECT * FROM numbers_mt(1000000000) LIMIT 3;

┌─number─┐
│      0 │
└────────┘
┌─number─┐
│      2 │
└────────┘
┌─number─┐
│      3 │
└────────┘

set max_block_size=100000000000;

create table X (A Int64) Engine=Memory;
insert into X values(1);
insert into X values(2);
insert into X values(3);
SELECT * FROM X;

┌─A─┐
│ 1 │
└───┘
┌─A─┐
│ 3 │
└───┘
┌─A─┐
│ 2 │
└───┘

3 строки в блоке

drop table X;
create table X (A Int64) Engine=Memory;
insert into X values(1)(2)(3);
select * from X
┌─A─┐
│ 1 │
│ 2 │
│ 3 │
└───┘
...