PostgreSQL 9.3分区不起作用

时间:2015-06-10 12:26:59

标签: postgresql database-partitioning

我有一张桌子,e,每天设置范围分区。主表和分区表已经如此定义。

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扫描的计划?

我试过......

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’);

我错过了什么?

2 个答案:

答案 0 :(得分:0)

如果未在表定义中设置SET constraint_exclusion = on;,则缺少data-*所有查询都将扫描所有表分区。

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

答案 1 :(得分:0)

我原来帖子的第一条评论是正确的。

  

您正在混合日期和时间戳。您应该定义检查约束以使用时间戳:CHECK (toi >= timestamp '2015-05-01 00:00:00' ...然后在查询中使用时间戳。 - a_horse_with_no_name