RANGE PARTITION
Тема дорожной карты · PostgreSQL
Секционирование по диапазону — стратегия секционирования таблиц PostgreSQL, при которой строки распределяются по секциям в зависимости от попадания значения столбца в определённый непрерывный диапазон: например, диапазон дат для данных временны́х рядов или числовой диапазон для упорядоченных идентификаторов. Для создания таблицы с секционированием по диапазону родительская таблица объявляется с PARTITION BY RANGE (column), а дочерние секции создаются с помощью FOR VALUES FROM (start) TO (end), где граница TO не включается. Секционирование по диапазону идеально подходит для нагрузок с временны́ми рядами — например, секционирование таблицы events по месяцам, — поскольку позволяет отсечению секций ограничивать сканирование только актуальными временны́ми окнами, а архивирование данных сводится к простой операции отсоединения и удаления старых секций. PostgreSQL поддерживает секционирование по диапазону по нескольким столбцам в виде составного ключа секции и позволяет использовать B-tree-индексы на каждой секции для эффективных диапазонных запросов. Администраторы баз данных сочетают секционирование по диапазону с pg_partman или пользовательскими скриптами обслуживания для автоматизации создания секций и политик хранения в крупных развёртываниях PostgreSQL.
Как это работает
RANGE PARTITION разбивает одну логическую таблицу на много физических партиций: по range (timestamp), list (регионы) или hash (шардинг по id). Каждая партиция — реальная таблица; родительская — routing-слой. Constraint exclusion позволяет планировщику пропускать нерелевантные партиции. Postgres 10+ поддерживает декларативное (PARTITION BY RANGE); pg_partman автоматизирует создание и retention. Особенно полезно для time-series: DROP старых партиций (мгновенно) вместо DELETE (медленно + bloat).
Когда применять
Партиционируйте, когда одна таблица переваливает ~50-100M строк или начинает тянуть maintenance (VACUUM, REINDEX, запросы). Партиционируйте по колонке, по которой чаще всего фильтруете (обычно время). pg_partman — для time-based жизненного цикла. Не партиционируйте преждевременно — на < 10M строк это добавляет операционный overhead без пользы; хорошо настроенных индексов хватает.
Типичные ошибки
Ловушки RANGE PARTITION: запросы без partition-ключа в WHERE (планировщик не может прунить — скан всех партиций, медленнее непартиционированного); unique constraint, обязанный охватить все партиции (нужен partition-ключ внутри); ручное создание партиций отстаёт (записи валятся, когда у "сегодня" нет партиции); over-партиционирование (10000 партиций по 100 строк — overhead планировщика затмевает выгоду).