Что такое части таблицы в ClickHouse?
Данные каждой таблицы ClickHouse из семейства движков MergeTree хранятся на диске в виде набора неизменяемых data parts.
Чтобы проиллюстрировать это, используем эту таблицу (адаптированную из датасета с ценами на недвижимость в Великобритании), в которой содержатся данные о дате продажи, городе, улице и цене проданной недвижимости в Соединённом Королевстве:
CREATE TABLE uk.uk_price_paid_simple
(
date Date,
town LowCardinality(String),
street LowCardinality(String),
price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street);
Вы можете выполнить запрос к этой таблице в нашей Песочнице ClickHouse SQL.
Часть данных создается каждый раз, когда в таблицу вставляется набор строк. Это показано на следующей диаграмме:
Когда сервер ClickHouse обрабатывает пример вставки 4 строк (например, с помощью оператора INSERT INTO), показанный на диаграмме выше, он выполняет несколько шагов:
① Сортировка: Строки сортируются по ключу сортировки таблицы (town, street), и для отсортированных строк создается разреженный первичный индекс.
② Разделение: Отсортированные данные разбиваются на столбцы.
③ Сжатие: Каждый столбец сжимается.
④ Запись на диск: Сжатые столбцы сохраняются как бинарные файлы столбцов в новом каталоге, соответствующем части данных этой вставки. Разреженный первичный индекс также сжимается и сохраняется в том же каталоге.
В зависимости от конкретного движка таблицы помимо сортировки могут выполняться и дополнительные преобразования.
Части данных самодостаточны и включают все метаданные, необходимые для интерпретации их содержимого без обращения к центральному каталогу. Помимо разреженного первичного индекса, части содержат дополнительные метаданные, такие как вторичные индексы пропуска данных, статистика столбцов, контрольные суммы, min-max индексы (если используется партиционирование) и не только.
Чтобы управлять количеством частей в таблице, задача фонового слияния периодически объединяет более мелкие части в более крупные, пока они не достигнут настраиваемого сжатого размера (обычно ~150 ГБ). Слитые части помечаются как неактивные и удаляются через настраиваемый интервал времени. Со временем этот процесс формирует иерархическую структуру слитых частей, поэтому такая таблица называется MergeTree:
Чтобы свести к минимуму количество исходных частей и накладные расходы на слияние, клиентам баз данных рекомендуется либо выполнять пакетную вставку кортежей, например по 20 000 строк за раз, либо использовать асинхронный режим вставки, при котором ClickHouse буферизует строки из нескольких входящих INSERT в одну и ту же таблицу и создает новую часть только после того, как размер буфера превысит настраиваемый порог или истечет тайм-аут.
Мониторинг частей таблицы
Вы можете получить список всех активных частей нашей таблицы из примера, существующих в данный момент, используя виртуальный столбец _part:
SELECT _part
FROM uk.uk_price_paid_simple
GROUP BY _part
ORDER BY _part ASC;
┌─_part───────┐
1. │ all_0_5_1 │
2. │ all_12_17_1 │
3. │ all_18_23_1 │
4. │ all_6_11_1 │
└─────────────┘
Приведённый выше запрос получает имена каталогов на диске, причём каждый каталог представляет собой активную часть данных таблицы. Компоненты этих имён каталогов имеют определённые значения; они задокументированы здесь для тех, кто хочет разобраться в этом подробнее.
В качестве альтернативы ClickHouse отслеживает информацию обо всех частях всех таблиц в системной таблице system.parts, а следующий запрос возвращает для нашей таблицы из примера выше список всех текущих активных частей, их уровень слияния и количество строк, хранящихся в этих частях:
SELECT
name,
level,
rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;
┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1 │ 1 │ 6368414 │
2. │ all_12_17_1 │ 1 │ 6442494 │
3. │ all_18_23_1 │ 1 │ 5977762 │
4. │ all_6_11_1 │ 1 │ 6459763 │
└─────────────┴───────┴─────────┘
Уровень слияния увеличивается на единицу при каждом последующем слиянии части. Уровень 0 означает, что это новая часть, которая еще не участвовала в слиянии.Последнее изменение 10 июня 2026 г.