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

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

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