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

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

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