Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: PostgreSQL, partitioning, partition pruning, query planning, sequential scan

Как PostgreSQL обрабатывает запрос к партиционированной таблице, если ключ партиции не указан в условии WHERE?

Проверяет понимание механизма партиционирования PostgreSQL и поведения запросов без указания ключа партиции.

Короткий ответ

Если ключ партиции не указан в WHERE, PostgreSQL не может выполнить отсечение партиций (partition pruning). Планировщик будет сканировать все партиции таблицы, выполняя последовательное сканирование (sequential scan) каждой из них. Это может привести к значительному снижению производительности, особенно при большом количестве партиций.

Длинный ответ

Как PostgreSQL обрабатывает запрос к партиционированной таблице без ключа партиции

Партиционирование в PostgreSQL позволяет разделить большую таблицу на более мелкие физические части (партиции) на основе значения ключа партиции. Когда запрос содержит условие WHERE, использующее этот ключ, планировщик может выполнить отсечение партиций (partition pruning) — то есть исключить из плана выполнения те партиции, которые заведомо не содержат нужных данных. Это значительно ускоряет запрос.

Однако если ключ партиции не указан в условии WHERE, планировщик не может определить, какие партиции могут содержать данные. В результате он вынужден сканировать все партиции таблицы. Для каждой партиции выполняется последовательное сканирование (sequential scan), если нет других индексов. Это может быть крайне неэффективно, особенно если партиций много (например, сотни или тысячи).

Пример

Предположим, у нас есть партиционированная таблица orders по полю order_date (по месяцам).

CREATE TABLE orders (
    id SERIAL,
    order_date DATE NOT NULL,
    amount NUMERIC
) PARTITION BY RANGE (order_date);

CREATE TABLE orders_2024_01 PARTITION OF orders
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE orders_2024_02 PARTITION OF orders
    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
-- ... другие партиции

Запрос с указанием ключа партиции:

SELECT * FROM orders WHERE order_date = '2024-01-15';
-- Планировщик выполнит отсечение и просканирует только orders_2024_01

Запрос без указания ключа партиции:

SELECT * FROM orders WHERE amount > 1000;
-- Планировщик просканирует ВСЕ партиции (orders_2024_01, orders_2024_02, ...)

Вывод

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

  • SQL

Ключевые слова

#PostgreSQL

#partitioning

#partition pruning

#query planning

#sequential scan

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.