разделенная таблица запроса postgres на current_date

У меня есть таблица в postgres с 10 миллионами строк, и она секционируется в месяц по столбцу даты created_on. Моя проблема в том, что мне часто нужно запрашивать такую ​​таблицу на временном интервале с этого момента.

Однако если попробовать

SELECT * 
FROM partitioned_table pt 
WHERE pt.created_on>current_date - '10 days'::INTERVAL

это проходит по всем секционированным таблицам.

А если я сделаю тот же запрос с фиксированной строкой даты:

SELECT * 
FROM partitioned_table pt
WHERE pt.created_on>'2017-11-17 - '10 days'::INTERVAL

это распространяется только на последнюю секционированную таблицу.

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


person Gabriele Tani    schedule 17.11.2017    source источник


Ответы (1)


У меня такая же проблема с разделением запросов.
Одно из решений - использование параметра запроса.
Например:

do $$
    declare x json;
    dt date;
    begin
        dt = current_date;
        explain(format json) into x select * from sr_scgenerated where date > dt;
        raise notice '%', x;
    end;
$$

Исключение ограничений работает только тогда, когда предложение WHERE запроса содержит константы (или параметры, предоставленные извне). Например, сравнение с неизменяемой функцией, такой как CURRENT_TIMESTAMP, не может быть оптимизировано, поскольку планировщик не может знать, в какой раздел может попасть значение функции во время выполнения.

https://www.postgresql.org/docs/11/ddl-partitioning.html

or

prepare query(date) as 
    select * from sr_scgenerated where date > $1;
   explain analyze execute query(current_date);
deallocate query;

из http://www.peterhenell.se/msg/PostgreSQL---Partition-Exclusion-with-nowcurrent_timestampcurrent_date

person DanStopka    schedule 05.06.2019