Партиции PostgreSQL не отсекаются: не прячьте ключ в функции

События разделены по created_at на месячные партиции. Отчёт нужен за один день, но EXPLAIN показывает чтение многих частей. В WHERE написано created_at::date = нужная дата: условие удобно человеку, однако не совпадает с простым диапазоном ключа партиционирования.

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

Как изменить решение

EXPLAIN
SELECT count(*) FROM events
WHERE created_at >= TIMESTAMPTZ '2026-10-10 00:00:00+03'
  AND created_at <  TIMESTAMPTZ '2026-10-11 00:00:00+03';

Условие включает начало дня и исключает начало следующего. Для timestamptz границы содержат часовой пояс отчёта. Это позволяет не зависеть от того, какая TimeZone установлена в соединении, при выборе конкретного рабочего дня.

Сначала определите, какой день нужен бизнесу: UTC, московский или локальный день филиала. Подстановка date без этой договорённости способна давать разные наборы событий при разных настройках соединения. Исправление производительности не должно незаметно поменять состав отчёта.

Что проверить на своих данных

Сравните EXPLAIN с преобразованием и диапазоном. Посмотрите, какие партиции участвуют, а в реальном исполнении — какие подузлы не выполнялись или были удалены. Для параметризованных запросов часть отсечения может происходить во время выполнения, поэтому один текст предварительного плана не всегда показывает всю картину.

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

Практика дальше

Разобрав чтение партиций, можно перейти к организации всего хранилища и загрузки. На Data Engineering Fast-Track вы работаете с Parquet и lakehouse-форматами, диагностируете Spark и собираете pipeline под управлением Airflow. В программе есть batch, streaming и повторная загрузка периодов.

Посмотреть программу и практику курса

Источник: Партиции PostgreSQL не отсекаются — официальная документация.

Другие задачи по теме: PostgreSQL: запись, блокировки и планы запросов.

Продолжить на практике

  • Data Engineering Fast‑Track: Kafka → Airflow → Spark ↗

    Практический fast-track по data engineering: за 4–6 недель собираем рабочий конвейер Kafka → Spark → Lakehouse под управлением Airflow. Разберём batch и streaming, окна и watermark, схемы и контракты. Мини‑проекты, Docker Compose, шаблоны DAG и пайплайнов. Курс подойдёт инженерам, аналитикам и тем, кто хочет освоить современные пайплайны данных с уверенным Python.