Устранение лишних секций в секционированных таблицах при запросе 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 ? (проверить пока возможности нет)


Ответы (0 шт):