I have a PostgreSQL database with a master table and 2 child tables. My master table:
CREATE TABLE test (
id serial PRIMARY KEY,
date timestamp without time zone
);
CREATE INDEX ON test(date);
My child tables:
CREATE TABLE test_20150812 (
CHECK ( date >= DATE '2015-08-12' AND date < DATE '2015-08-13' )
) INHERITS (test);
CREATE TABLE test_20150811 (
CHECK ( date >= DATE '2015-08-11' AND date < DATE '2015-08-12' )
) INHERITS (test);
CREATE INDEX ON test_20150812(date);
CREATE INDEX ON test_20150811(date);
When I execute query like:
select * from test_20150812 where date > '2015-08-12' order by date desc;
It returns very quickly (20-30 miliseconds). EXPLAIN
output:
Limit (cost=0.00..2.69 rows=50 width=212)
-> Index Scan Backward using test_20150812_date_idx on test_20150812 (cost=0.00..149538.92 rows=2782286 width=212)
Index Cond: (date > '2015-08-12 00:00:00'::timestamp without time zone)
However if I execute query like:
select * from test where date > '2015-08-12' order by date desc;
It takes a long time (10-15 seconds). EXPLAIN
output:
Limit (cost=196687.06..196687.19 rows=50 width=212)
-> Sort (cost=196687.06..203617.51 rows=2772180 width=212)
Sort Key: public.test.date
-> Result (cost=0.00..104597.24 rows=2772180 width=212)
-> Append (cost=0.00..104597.24 rows=2772180 width=212)
-> Seq Scan on test (cost=0.00..0.00 rows=1 width=1857)
Filter: (date > '2015-08-12 00:00:00'::timestamp without time zone)
-> Seq Scan on test_20150812 test (cost=0.00..104597.24 rows=2772179 width=212)
Filter: (date > '2015-08-12 00:00:00'::timestamp without time zone)
constraint_exclusion
is set to ON
in my postgresql.conf
. Therefore it should only be executed on test_20150812
.
I see that, if a query is executed on master table, indices are never used. How can I improve it? I want to make all my queries on my master table. When querying for a specific date I expect no performance difference between querying on the master table or the child table.
test_20150812
vs.test_table_20150812
) in favor of short names. You forgot to provide your version of Postgres and please provide the output ofEXPLAIN (ANALYZE, BUFFERS)
, not justEXPLAIN
. Also odd:Seq Scan on test_table_20150812 test_table
(now simplified totest_20150812 test
) isn't valid explain output ...