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

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

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