PostgreSQL分区。约束排除未在选择时生效

PostgreSQL分区。约束排除未在选择时生效,postgresql,constraints,partitioning,Postgresql,Constraints,Partitioning,我的分区表SELECT查询包括所有分区表,即使检查已到位且constraint_exclusion=on insert触发器工作正常,新行被插入到正确的表中。但是,SELECT将在所有表上运行,而不管my WHERE子句如何 这是我的配置: constraint_exclusion = on (both in postgresql.conf and also tried with "ALTER DATABASE bigtable SET constraint_exclusion=on;") 主

我的分区表SELECT查询包括所有分区表,即使检查已到位且constraint_exclusion=on

insert触发器工作正常,新行被插入到正确的表中。但是,SELECT将在所有表上运行,而不管my WHERE子句如何

这是我的配置:

constraint_exclusion = on (both in postgresql.conf and also tried with "ALTER DATABASE bigtable SET constraint_exclusion=on;")
主表:

CREATE TABLE bigtable (
    id bigserial NOT NULL,
    userid integer NOT NULL,
    inserttime timestamp with time zone NOT NULL DEFAULT now()
)
子表1:

CREATE TABLE bigtable_2013_11 (CHECK ( inserttime >= DATE '2013-11-01' AND inserttime < DATE '2013-12-01' )) INHERITS (bigtable);        
这几乎就是教科书的设置。插入操作很好:

INSERT INTO bigtable (userid, inserttime) VALUES ('1', now());
上述插入导致新行仅正确插入到“bigtable_2013_11”中

但是,我无法让SELECT排除不相关的表。所有选择始终在所有表上运行。当使用以下SELECT查询时,我希望bigtable_2013_12被排除在外:

SELECT * FROM bigtable WHERE inserttime >= DATE '2013-11-01'::date AND inserttime < '2013-12-01'::date;

SELECT * FROM bigtable WHERE EXTRACT(MONTH FROM inserttime) = 11 AND EXTRACT (YEAR FROM inserttime) = 2013;
然而,结果总是这样:

"Result  (cost=0.00..68.90 rows=17 width=20)"
"  ->  Append  (cost=0.00..68.90 rows=17 width=20)"
"        ->  Seq Scan on bigtable  (cost=0.00..0.00 rows=1 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"
"        ->  Seq Scan on bigtable_2013_11 bigtable  (cost=0.00..34.45 rows=8 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"
"        ->  Seq Scan on bigtable_2013_12 bigtable  (cost=0.00..34.45 rows=8 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"

为什么我的支票没有兑现?我没有主意了。一切似乎都设置正确。我错过什么了吗?任何帮助都将不胜感激。

这里有两件事。一个是序列扫描。另一个是union all,即append运算符。就我所知,后者是完全不可避免的。这就是表继承的工作原理——至少在我上次使用它时是这样*然而*,这就把我们带到了前者,您可以在该日期字段上添加一个索引,以消除不必要的seq扫描并提前退出


或者,可能与日期/时间戳转换有关。

Denis!我想你知道了什么。当我将列类型更改为DATE时,它可以正常工作。显然,这里的日期/时间戳转换确实有问题。我将了解如何在支票中使用时间戳而不是日期。谢谢!确认。在检查和过程中使用带时区的时间戳而不是日期解决了问题。再次感谢!
INSERT INTO bigtable (userid, inserttime) VALUES ('1', now());
SELECT * FROM bigtable WHERE inserttime >= DATE '2013-11-01'::date AND inserttime < '2013-12-01'::date;

SELECT * FROM bigtable WHERE EXTRACT(MONTH FROM inserttime) = 11 AND EXTRACT (YEAR FROM inserttime) = 2013;
"Result  (cost=0.00..68.90 rows=17 width=20)"
"  ->  Append  (cost=0.00..68.90 rows=17 width=20)"
"        ->  Seq Scan on bigtable  (cost=0.00..0.00 rows=1 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"
"        ->  Seq Scan on bigtable_2013_11 bigtable  (cost=0.00..34.45 rows=8 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"
"        ->  Seq Scan on bigtable_2013_12 bigtable  (cost=0.00..34.45 rows=8 width=20)"
"              Filter: ((inserttime >= '2013-11-02'::date) AND (inserttime < '2013-11-30'::date))"