Устранение лишних секций в секционированных таблицах при запросе SELECT, PostgreSQL
PostgresSQL 12
Подскажите пожалуйста, я делаю такого рода запросы
SELECT count(*)
FROM subject_position_info spi
WHERE spi.period_id IN (SELECT p.period_id
FROM periods p
WHERE p.quarter = 1
AND p.year = 2019
);
SELECT count(*)
FROM subject_position_info_old spi
WHERE spi.period_id IN (SELECT p.period_id
FROM periods p
WHERE p.quarter = 1
AND p.year = 2019
);
subject_position_info - таблица секционированная Декларативно по ключу period_id
subject_position_info_old вторая обычная
Данные одинаковые
Вложенный SELECT возвращает 1 значение, цифру 5 (но если убрать p.quarter = 1, будет 4 числа поэтому только IN)
Разницы в скорости выполнения этих запросов нет ни какой, всё равно сканируются все партиции
Если же указать в место вложенного SELECT , IN (5). то выбирается только та партиция которая нужна и время выполнения уже отличается на порядки доли секунды и минуты.
Если заменить IN на = , отсечение начинает работать нормально, но такой вариант не подходит
Eсли в IN задать в ручную (5,6,7,8) тоже работает , но интересен только SELECT
Нужно добиться динамического отсечения партиций во время выполнения запроса, которое анонсировано в документации
Это EXPLAIN запроса к партицированной таблице https://explain.depesz.com/s/wQeQ
Это к обычной https://explain.depesz.com/s/nl1dQ
Это когда SELECT count(*) FROM subject_position_info spi WHERE spi.period_id IN( 5 ); https://explain.depesz.com/s/4hE2
ВОПРОС : Как заставить работать динамическое отсечение партиций во время выполнения запроса ? (В документации написано что это так и работает , на практике нет :( ) , может дело в версии PostgresSQL ? (проверить пока возможности нет)