PRO

Как реализовать партиционирование таблиц?

Партиционирование — это разбиение большой таблицы на несколько физических частей по правилу, например по диапазону дат, списку tenant_id или хешу ключа. В PostgreSQL чаще всего используют declarative partitioning через 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 применяют, когда важнее равномерность распределения, чем естественный диапазон. Главное — чтобы ключ партиционирования соответствовал реальным запросам и операции обслуживания таблицы стали проще, а не сложнее.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге