PostgreSQL 9.3 分区不工作

PostgreSQL 9.3 Partitions Not Working

我有一个 table,e,每天设置范围分区。主 table 和分区 table 已经这样定义了。

CREATE TABLE e (
  toi TIMESTAMP WITH TIME ZONE
WITH (
 OIDS=TRUE
);

CREATE TABLE e_20150501
CONSTRAINT e_20150501_toi_chk CHECK (toi >= ‘2015-05-01’::DATE AND toi < ‘2015-  05-02’::DATE)
INHERITS (e)
WITH (
  OIDS=TRUE
);

出于某种原因,无论我如何在 SELECT 中构建我的 WHERE 子句,我似乎无法获得一个不对每个分区进行 Seq 扫描的计划 table?

我试过了……

WHERE toi::DATE >= ‘2015-05-01’::DATE AND toi::DATE <= ‘2015-05-02’::DATE;

WHERE toi >= to_timestamp(‘2015-05-01 12:30:57’, ‘YYYY-MM-DD HH24:MI:SS’) AND toi <= to_timestamp(‘2015-05-02 12:30:57’, ‘YYYY-MM-DD HH24:MI:SS’);

我错过了什么?

您缺少 SET constraint_exclusion = on;,但您的 table 定义中没有设置它,所有查询都将扫描所有 table 个分区。

参见手册 here 第 5.9.4 节。分区和约束排除

我的第一条评论 post 是正确的。

You are mixing dates and timestamps. You should define your check constraint to use a timestamp as well: CHECK (toi >= timestamp '2015-05-01 00:00:00' ... And then use timestamps in your query as well. – a_horse_with_no_name