Перейти к основному содержимому
Перейти к основному содержимому

Части таблицы

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 указывает, что это новая часть, которая еще не была объединена.