Как понять часть и раздел ClickHouse? - PullRequest
0 голосов
/ 10 февраля 2020

Я вижу, что clickhouse создал несколько каталогов для каждого ключа раздела.

Документация гласит формат имени каталога: имя раздела , минимальное количество блоков данных , максимальное количество блоков данных и уровень чанка . Например, имя каталога 201901_1_11_1.

Я думаю, это означает, что каталог является частью, которая принадлежит разделу 201901 , имеет блоки от 1 до 11 и включена уровень 1 . Таким образом, у нас может быть другая часть, каталог которой похож на 201901_12_21_1, что означает, что эта часть принадлежит разделу 201901 , имеет блоки от 12 до 21 и на уровне 1 .

Так что я думаю, что разделение на несколько частей. Я прав?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Детали - части таблицы, в которой хранятся строки. Одна часть = одна папка со столбцами.

Разделы - это виртуальные объекты. У них нет физического представления. Но вы можете сказать, что эти части принадлежат одному разделу.


Выбор не заботит разделы.

Select не знает о ключах разделения.

ПОТОМУ ЧТО каждая часть имеет специальные файлы minmax_ {PARTITIONING_KEY_COLUMN} .idx Эти файлы содержат минимальные и максимальные значения этих столбцов в этой части. Также эти значения minmax_ хранятся в памяти в виде (c ++ vector) списка деталей.

create table X (A Int64, B Date, K Int64,C String) 
Engine=MergeTree partition by (A, toYYYYMM(B)) order by K;

insert into X values (1, today(), 1, '1');

cd /var/lib/clickhouse/data/default/X/1-202002_1_1_0/
ls -1 *.idx
minmax_A.idx   <-----
minmax_B.idx   <-----
primary.idx

SET send_logs_level = 'debug';
select * from X where A = 555;

(SelectExecutor): MinMax index condition: (column 0 in [555, 555])
(SelectExecutor): Selected 0 parts by date

SelectExecutor проверил список деталей в памяти и нашел 0 деталей, потому что minmax_A.idx = (1,1) и это выберите необходимый (555, 555).

CH не хранит значения ключей разделения.

Например, toYYYYMM (today ()) = 202002, но этот 202002 не сохраняется ни в части, ни где-либо еще.

магазины minmax_B.idx (18302, 18302) (2020-02-10 == select toInt16(today()))

1 голос
/ 09 марта 2020

В моем случае я использовал groupArray () и arrayEnumerate () для ранжирования в Populate. Я думал, что Populate может выполнить запрос с новыми данными в разделе (в моем случае: toStartOfDay (Date)), общая сумма новых вставленных данных верна, но функция groupArray () работает неправильно.

Я думаю, что это произошло потому, что при вставке одной части, CH будет группировать Array () и сразу ранжировать каждую часть, а затем объединять части в один раздел, поэтому я не получу точно конечный результат groupArray () и arrayEnumerate () функция. Сводка, объединение

[groupArray (part_1) + groupArray (part_2)] отличается от groupArray (Partition)

с

Partition = part_1 + part_2

Решение, которое я попробовал, состоит в том, чтобы вставить новые данные как один размер блока, так же, как с помощью groupArray (), чтобы уменьшить новые данные до числа строк, которое меньше, чем max_insert_block_size = 1048576 , Он сделал правильно, но трудно вставить новые данные за 1 день как одну часть, потому что он будет использовать слишком много памяти для запросов при заполнении данных за 1 день (почти 150-200-200 строк).

Но у вас есть другое решение для Заполнить с groupArray () для новой вставки данных, например, заставить CH использовать POPULATE на каждом Разделе, а не на каждой Части после объединения всех частей в один Раздел?

...