postgres 在 current_date 查询分区表

Posted

技术标签:

【中文标题】postgres 在 current_date 查询分区表【英文标题】:postgres query partitioned table on current_date 【发布时间】:2017-11-17 22:27:02 【问题描述】:

我在 postgres 中有一个包含 1000 万行的表,它每月按日期列“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 是动态分配的。知道如何处理它而无需每次都指定日期吗?

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于postgres 在 current_date 查询分区表的主要内容,如果未能解决你的问题,请参考以下文章

Postgres数据库中奇特的时区处理

休眠 current_date 和 date_trunc

如何创建自定义函数来分析 postgres 中的表

postgres怎么查数据库在使用

需要将 date_part 从 postgres 转换为 oracle

第三十五章 SQL函数 CURRENT_DATE