Партиционирование делит таблицу на крупные независимые группы по выражению 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, применяемый фоновыми процессами.