deшка
Урок 10.7

Партиции и жизненный цикл данных

Как PARTITION BY помогает обслуживать таблицу и почему не заменяет сортировочный ключ.

Партиционирование делит таблицу на крупные независимые группы по выражению PARTITION BY. Его используют прежде всего для управления периодами данных: хранением, переносом и удалением. Оно также может помочь исключить ненужные группы при запросе.

Как строки попадают в партицию

У таблицы событий с временем event_time можно задать:

PARTITION BY toYYYYMM(event_time)
ORDER BY (event_type, event_time)

Значение выражения за январь 2026 года равно 202601, за февраль — 202602. Каждая партиция содержит одну или несколько физических частей, parts. Одна вставка с событиями из двух месяцев может создать части в двух партициях.

Фоновые слияния объединяют parts только внутри одной партиции. Для движков, схлопывающих или суммирующих одинаковые ключи, это также граница фоновой обработки.

Партиция, сортировка и шард

МеханизмЧто определяет
PARTITION BYКрупные независимые группы хранения и обслуживания
ORDER BYПорядок строк внутри каждой части
PRIMARY KEYОпорные значения для поиска диапазонов
Ключ шардированияНа каком узле хранить строку

Партиция за месяц может существовать на нескольких шардах. Каждая её часть имеет собственную сортировку. Эти механизмы действуют на разных уровнях и не заменяют друг друга.

Исключение данных при чтении

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

Анализатор должен связать условие запроса с выражением партиционирования. Эффект проверяют через EXPLAIN indexes = 1: сколько частей и гранул осталось после условий.

Отсечение целого месяца полезно, но внутри месяца может быть очень много строк. Частый фильтр по типу события всё ещё требует подходящего сортировочного ключа. Деление на всё более мелкие партиции не исправляет неудачный ORDER BY.

Почему не стоит делать партицию на каждый ID

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

Период выбирают по объёму и сроку хранения. Месяц подходит многим журналам событий; день — большому объёму с ежедневным удалением. Для небольшой таблицы можно обойтись без отдельного партиционирования.

Управление периодом

DROP PARTITION удаляет целую партицию; DETACH исключает её из активной таблицы, сохраняя файлы для отдельного управления. ATTACH возвращает совместимые отсоединённые данные. Это операции с периодом, а не способ выбрать одну ошибочную строку.

При выборе ключа полезно ответить на два вопроса: какие группы предстоит обслуживать вместе и сколько таких групп возникнет. Для удаления по сроку хранения также существует TTL, применяемый фоновыми процессами.

Войти, чтобы отмечатьдальше →
10.8 →Движки таблиц и баз данных