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