patternsqlMinor
PostgreSQL table partitioning problem
Viewed 0 times
postgresqlproblempartitioningtable
Problem
I partitioned my table day by day. The child tables are look like points_20150830. Every day, I run a cron job to create table and I insert records without using any trigger function. I insert records by calculating day of timestamp.
However, when I run a select query, query plan shows that every child table visited without checking constraints. Also I enabled constraints via "constraint_exclusion = on" in postgresql.conf
I think that the problem may be related to timestamp with timezone but I could not find any solution.
Thanks for your help, here are details
Master table :
Child table :
Query that I perform :
Result of the query :
http://explain.depesz.com/s/VDI0
However, when I run a select query, query plan shows that every child table visited without checking constraints. Also I enabled constraints via "constraint_exclusion = on" in postgresql.conf
I think that the problem may be related to timestamp with timezone but I could not find any solution.
Thanks for your help, here are details
Master table :
CREATE TABLE points (
point_key bytea,
users_id integer,
point_date timestamp with time zone
);
CREATE INDEX points_point_date ON points USING btree (point_date);
CREATE INDEX points_users_id ON points USING btree (users_id);Child table :
CREATE TABLE points_20150701 (
CONSTRAINT points_20150701_point_date_check CHECK (((point_date >= '2015-07-01 00:00:00'::timestamp without time zone) AND (point_date < '2015-07-02 00:00:00'::timestamp without time zone)))
)
INHERITS (points);
CREATE INDEX points_20150701_point_date ON points_20150701 USING btree (point_date);
CREATE INDEX points_20150701_users_id ON points_20150701 USING btree (users_id);Query that I perform :
EXPLAIN (ANALYZE, BUFFERS)
SELECT
COUNT(point_key) as points
FROM points
WHERE users_id = 100 AND point_date >= '2015-08-25 00:00:00'::timestamp AND point_date <= '2015-08-31 23:59:59'::timestampResult of the query :
http://explain.depesz.com/s/VDI0
Solution
I'm going to add my answer, which was correct in the comments, as the answer here.
Be specific about your types!
In your master table, you have
In your
Then, in your query, you just use
To fix your problems, make sure that all of these entries are referring to a consistent type. In your comments above, you indicated that you changed all entries to refer to the type
Be specific about your types!
In your master table, you have
point_date as a timestamp with time zone. In your
CHECK constraint, you have used timestamp without time zone. Then, in your query, you just use
point_date >= '2015-08-25 00:00:00'::timestamp, thus using a timestamp type in your WHERE predicate. To fix your problems, make sure that all of these entries are referring to a consistent type. In your comments above, you indicated that you changed all entries to refer to the type
timestamp with time zone, and that it fixed your issues.Context
StackExchange Database Administrators Q#112768, answer score: 2
Revisions (0)
No revisions yet.