184 похожих чатов

Всем привет! Вникаю в документацию кликхауза, и хотелось бы прояснить

некоторые вопросы терминологии, мб кто-то подскажет. Есть следующие термины: partition, data part, granule и data block. Поправьте, если где-то ошибаюсь. Partition - это то что регулируется PARTTION BY, каждая партиция - отдельный раздел (или файл?) на диске, ускоряет запросы (правд ли?). Data part - это то, куда данные попадают при вставке, внутри куска они отсортированы по ORDER BY, затем куски в фоне мерджатся в куски побольше. Granule - это логическое разделение data part’а, по факту засечки индекса по PRIMARY KEY, который в свою очередь чаще всего является ORDER BY’ем, при чтении мы бежим по засечкам, и вычитываем нужные нам гранулы. А вот что такое data block?

5 ответов

18 просмотров

> Partition - это то что регулируется PARTTION BY да >,каждая партиция - отдельный раздел (или файл?) на диске каждая партиция отдельный логический раздел на диске физически это префикс в названии каталогов в /var/lib/clickhouse/data/db/table/{partition_name}_{min_block}_{max_block}_{how_much_merges_applied}` > ускоряет запросы (правд ли?) правда, но слишком мелкие partition запросы наоборот замедляют. базовая рекомендация делайте PARTITION BY toYYYYMM(datetime_column) не ошибетесь > Granule - это логическое разделение data part’а, по факту засечки индекса по PRIMARY KEY, который в свою очередь чаще всего является ORDER BY’ем, при чтении мы бежим по засечкам, и вычитываем нужные нам гранулы. почти все верно, только гранула логическая величина когда берется каждая X запись из набора и значения primary key идут в mrk файл, один парт один .mrk файл внутри него в парте может быть много записей, соответсвенно размер .mrk файла растет тем больше чем больше записей в парте (но незначительно) есть еще data skip indexes - и там гранула и гранулярность означает сколько гранул из primary key будет покрывать одна структура из data skip index при чтении мы бежим по засечкам. вычитываем из mrk смещение внутри .bin и читаем из .bin ДАТА БЛОКИ, расжимаем их и внутри расжатого блока берем второе смещение из .mrk чтобы понять где начинается исходная запись и дальше отправляем это в вышестоящий конвейер на фильтрацию \ агрегацию \ сортировку > Data part - это то, куда данные попадают при вставке, внутри куска они отсортированы по ORDER BY, затем куски в фоне мерджатся в куски побольше да, все правильно понимаете, после merge двух партов увеличивается цифра в how_much_merges_applied в результирующем парте см. формат именования еще раз /var/lib/clickhouse/data/db/table/{partition_name}_{min_block}_{max_block}_{how_much_merges_applied}`

partition -- это логическое понятие. Это объединение партов. Оно вообще чисто логическое. мы просто говорим что парты 202101_1_1000_99 и 202101_2034_4560_99 принадлежат одной партиции. парты -- это как раз папки, они образуются при инсертах И мержах да Granule -- это на что указывают засечки datablock -- это понятие native протокола, это не про хранение, это "результат запроса", это кол-во строк в блоке выдачи, т.е. там идут 30 строк колонка 1, 30 строк колонка 2, 30 строк колонка 3, 65536 строк колонка 1, 65536 строк колонка 2, 65536 строк колонка 3,

Slach [altinity]
> Partition - это то что регулируется PARTTION BY ...

извините опять гранулы с гранулярностью попутал

Фёдор-Erastov Автор вопроса
Denny [Altinity]
partition -- это логическое понятие. Это объединен...

> datablock -- это понятие native протокола, это не про хранение, это "результат запроса", это кол-во строк в блоке выдачи Так всё же, это как вы говорите «результат запроса», или как описал @BloodJazMan выше, это всё-таки что-то про хранение. Очень какой-то расплывчатый термин, в доке он используется как минимум в трёх разделах, и по контексту как будто всё разное означает. Например, я так понимаю, в skip index’ах под «блоком» подразумевается опять же логическая группировка гранул, то есть первичный индекс отсекаеает гранулы, а скип индекс отсекает «блоки» гранул?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта