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

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

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