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

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

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