Части таблицы
Что такое части таблицы в ClickHouse?
Данные из каждой таблицы в семье движков MergeTree хранятся на диске в виде коллекции неизменяемых data parts
.
Чтобы проиллюстрировать это, мы используем эту таблицу (адаптированную из набора данных о ценах на недвижимость в Великобритании), отслеживающую дату, город, улицу и цену проданных объектов недвижимости в Великобритании:
Вы можете выполнить запрос к этой таблице в нашем SQL Playground ClickHouse.
Часть данных создается каждый раз, когда набор строк вставляется в таблицу. Следующая схема иллюстрирует это:

Когда сервер ClickHouse обрабатывает пример вставки с 4 строками (например, через оператор INSERT INTO), описанный на схеме выше, он выполняет несколько шагов:
① Сортировка: Строки сортируются по ключу сортировки таблицы (town, street)
, и для отсортированных строк генерируется разреженный первичный индекс.
② Разбиение: Отсортированные данные разделяются на колонки.
③ Сжатие: Каждая колонка сжимается.
④ Запись на диск: Сжатые колонки сохраняются как бинарные файлы колонок в новой директории, представляющей часть данных вставки. Разреженный первичный индекс также сжимается и хранится в той же директории.
В зависимости от конкретного движка таблицы могут происходить дополнительные преобразования возможно параллельно со сортировкой.
Части данных являются самодостаточными, включая всю метаинформацию, необходимую для интерпретации их содержимого без необходимости в центральном каталоге. Помимо разреженного первичного индекса, части содержат дополнительную метаинформацию, такую как вторичные индексы пропуска данных, статистика колонок, контрольные суммы, минимально-максимальные индексы (если используется партиционирование) и другие.
Слияние частей
Чтобы управлять количеством частей для таблицы, периодически выполняется фоновая задача слияния, которая объединяет меньшие части в большие, пока они не достигнут настраиваемого размера после сжатия (обычно ~150 ГБ). Слитые части помечаются как неактивные и удаляются после настраиваемого временного интервала. Со временем этот процесс создает иерархическую структуру слитых частей, благодаря чему таблица называется MergeTree:

Чтобы минимизировать количество первоначальных частей и накладные расходы на слияние, клиентам баз данных рекомендуется вставлять кортежи в пакетах, например, по 20,000 строк за один раз, или использовать асинхронный режим вставки, в котором ClickHouse буферизует строки из нескольких входящих INSERT в одну и ту же таблицу и создает новую часть только после превышения размера буфера заданного порога или истечения времени ожидания.
Мониторинг частей таблицы
Вы можете выполнить запрос на список всех существующих активных частей нашей примерной таблицы, используя виртуальную колонку _part
:
Запрос выше извлекает имена директорий на диске, каждая из которых представляет активную часть данных таблицы. Компоненты этих имен директорий имеют конкретные значения, которые документированы здесь для тех, кто хочет исследовать дальше.
Либо ClickHouse отслеживает информацию для всех частей всех таблиц в системной таблице system.parts, и следующий запрос возвращает для нашей примерной таблицы список всех текущих активных частей, их уровень слияния и количество строк, хранящихся в этих частях:
Уровень слияния увеличивается на единицу с каждым дополнительным слиянием части. Уровень 0 указывает на то, что это новая часть, которая еще не была слита.