некоторые вопросы терминологии, мб кто-то подскажет. Есть следующие термины: partition, data part, granule и data block. Поправьте, если где-то ошибаюсь. Partition - это то что регулируется PARTTION BY, каждая партиция - отдельный раздел (или файл?) на диске, ускоряет запросы (правд ли?). Data part - это то, куда данные попадают при вставке, внутри куска они отсортированы по ORDER BY, затем куски в фоне мерджатся в куски побольше. Granule - это логическое разделение data part’а, по факту засечки индекса по PRIMARY KEY, который в свою очередь чаще всего является ORDER BY’ем, при чтении мы бежим по засечкам, и вычитываем нужные нам гранулы. А вот что такое data block?
> 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,
извините опять гранулы с гранулярностью попутал
> datablock -- это понятие native протокола, это не про хранение, это "результат запроса", это кол-во строк в блоке выдачи Так всё же, это как вы говорите «результат запроса», или как описал @BloodJazMan выше, это всё-таки что-то про хранение. Очень какой-то расплывчатый термин, в доке он используется как минимум в трёх разделах, и по контексту как будто всё разное означает. Например, я так понимаю, в skip index’ах под «блоком» подразумевается опять же логическая группировка гранул, то есть первичный индекс отсекаеает гранулы, а скип индекс отсекает «блоки» гранул?
Обсуждают сегодня