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

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

Что такое части таблиц в ClickHouse?


Данные из каждой таблицы в семействе MergeTree engine ClickHouse организованы на диске в виде коллекции неизменяемых data parts.

Для иллюстрации этого мы используем эту таблицу (адаптированную из набора данных о ценах на недвижимость в Великобритании), отслеживающую дату, город, улицу и цену проданных объектов недвижимости в Великобритании:

CREATE TABLE uk.uk_price_paid_simple
(
    date Date,
    town LowCardinality(String),
    street LowCardinality(String),
    price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street);

Вы можете запросить эту таблицу в нашем ClickHouse SQL Playground.

Часть данных создается каждый раз, когда набор строк вставляется в таблицу. Следующая диаграмма изображает этот процесс:


Когда сервер ClickHouse обрабатывает пример вставки с 4 строками (например, через оператор INSERT INTO), изображенный на диаграмме выше, он выполняет несколько шагов:

Сортировка: Строки сортируются по ^^ключу сортировки^^ таблицы (город, улица), и генерируется разреженный первичный индекс для отсортированных строк.

Разделение: Отсортированные данные разбиваются на колонки.

Сжатие: Каждая колонка сжимается.

Запись на диск: Сжатые колонки сохраняются в виде бинарных файлов колонок в новой директории, представляющей часть данных вставки. Разреженный первичный индекс также сжимается и сохраняется в той же директории.

В зависимости от конкретного движка таблицы, могут происходить дополнительные преобразования параллельно со сортировкой.

Части ^^data parts^^ являются самодостаточными, включая все метаданные, необходимые для интерпретации их содержимого без необходимости в центральном каталоге. Кроме разреженного первичного индекса, ^^части^^ содержат дополнительные метаданные, такие как вторичные индексы пропуска данных, статистика по колонкам, контрольные суммы, минимально-максимальные индексы (если используется партиционирование), и многое другое.

Слияние частей

Чтобы управлять числом ^^частей^^ на таблицу, фоновая слияние периодически объединяет меньшие ^^части^^ в более крупные, пока они не достигнут настраиваемого сжатого размера (обычно ~150 ГБ). Слитые ^^части^^ помечаются как неактивные и удаляются после настраиваемого интервала времени. Со временем этот процесс создает иерархическую структуру слитых ^^частей^^, из-за чего таблица называется таблицей ^^MergeTree^^:


Чтобы минимизировать число начальных ^^частей^^ и накладные расходы на слияния, клиентам баз данных рекомендуется либо вставлять кортежи оптом, например, 20,000 строк за один раз, либо использовать асинхронный режим вставки, в котором ClickHouse буферизует строки из нескольких входных INSERT-операций в одну и ту же таблицу и создает новую часть только после превышения размера буфера заданного порога или истечения времени ожидания.

Мониторинг частей таблиц

Вы можете запросить список всех текущих активных ^^частей^^ нашей примерной таблицы, используя виртуальную колонку _part:

SELECT _part
FROM uk.uk_price_paid_simple
GROUP BY _part
ORDER BY _part ASC;

   ┌─_part───────┐
1. │ all_0_5_1   │
2. │ all_12_17_1 │
3. │ all_18_23_1 │
4. │ all_6_11_1  │
   └─────────────┘

Запрос выше извлекает имена директорий на диске, каждая из которых представляет активную часть данных таблицы. Компоненты этих имен директорий имеют определенные значения, которые документированы здесь для тех, кто заинтересован в дополнительном исследовании.

Кроме того, ClickHouse отслеживает информацию для всех ^^частей^^ всех таблиц в системной таблице system.parts, и следующий запрос возвращает для нашей примерной таблицы выше список всех текущих активных ^^частей^^, их уровень слияния и количество строк, хранящихся в этих ^^частях^^:

SELECT
    name,
    level,
    rows
FROM system.parts
WHERE (database = 'uk') AND (`table` = 'uk_price_paid_simple') AND active
ORDER BY name ASC;

   ┌─name────────┬─level─┬────rows─┐
1. │ all_0_5_1   │     1 │ 6368414 │
2. │ all_12_17_1 │     1 │ 6442494 │
3. │ all_18_23_1 │     1 │ 5977762 │
4. │ all_6_11_1  │     1 │ 6459763 │
   └─────────────┴───────┴─────────┘

Уровень слияния увеличивается на один с каждым дополнительным слиянием на часть. Уровень 0 указывает на то, что это новая часть, которая еще не была слита.