我有一张桌子,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’);
我错过了什么?
答案 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