PARTITION BY, чтобы ускорить запросы, упростить обслуживание больших таблиц и уменьшить объём сканирования.
Как реализовать партиционирование таблиц?
Подробный ответ
Что такое партиционирование
Партиционирование — это способ разбить одну логическую таблицу на набор физических частей — партиций. Для приложения это по-прежнему одна таблица, а СУБД уже сама решает, в какой партиции хранить строку и какие партиции читать при запросе.
Основная цель — уменьшить объём данных, который нужно читать, индексировать и обслуживать за один раз.
Основные стратегии
RANGE — по диапазону значений, чаще всего по времени:
created_at,event_date,order_date;LIST — по набору значений, например по
tenant_id, региону или типу сущности;HASH — по хешу ключа, когда нужен более равномерный расклад без естественного диапазона.
Как это выглядит в PostgreSQL
В PostgreSQL обычно используют declarative partitioning:
CREATE TABLE events (
id BIGINT,
created_at TIMESTAMP NOT NULL,
tenant_id BIGINT NOT NULL,
payload JSONB
) PARTITION BY RANGE (created_at);Дальше создают партиции:
CREATE TABLE events_2026_08 PARTITION OF events
FOR VALUES FROM ('2026-08-01') TO ('2026-09-01');Система сама направляет вставку в нужную партицию, если ключ партиционирования указан корректно.
Когда партиционирование помогает
когда таблица очень большая и большинство запросов фильтруется по одному измерению, например по времени;
когда нужно быстро удалять старые данные целыми кусками (drop partition вместо тяжёлого delete);
когда нужно уменьшить размер индексов и ускорить vacuum/maintenance;
когда надо изолировать горячие и холодные данные.
На что обращать внимание
ключ партиционирования должен совпадать с типовыми фильтрами в
WHERE;слишком мелкие партиции создают overhead на планирование и обслуживание;
слишком крупные партиции почти не дают выигрыша;
нужно заранее продумать индексы внутри партиций;
важно, как будут выполняться
JOINи агрегации между партициями.
Практический ответ
Партиционирование я бы внедрял, когда одна таблица вырастает настолько, что обычные индексы и оптимизация запросов уже не спасают. Чаще всего для событийных и временных данных выбирают PARTITION BY RANGE по дате, для multi-tenant систем — LIST по tenant_id, а HASH применяют, когда важнее равномерность распределения, чем естественный диапазон. Главное — чтобы ключ партиционирования соответствовал реальным запросам и операции обслуживания таблицы стали проще, а не сложнее.
Оцени свой прогресс