Ich habe eine PostgreSQL-Datenbank mit einer Mastertabelle und 2 untergeordneten Tabellen. Mein Mastertisch:
CREATE TABLE test (
id serial PRIMARY KEY,
date timestamp without time zone
);
CREATE INDEX ON test(date);
Meine Kindertische:
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);
Wenn ich eine Abfrage wie folgt ausführe:
select * from test_20150812 where date > '2015-08-12' order by date desc;
Es kehrt sehr schnell zurück (20-30 Millisekunden). EXPLAIN
Ausgabe:
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)
Wenn ich jedoch eine Abfrage wie folgt ausführe:
select * from test where date > '2015-08-12' order by date desc;
Es dauert lange (10-15 Sekunden). EXPLAIN
Ausgabe:
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
ist ON
in meinem eingestellt postgresql.conf
. Daher sollte es nur am ausgeführt werden test_20150812
.
Ich sehe, dass, wenn eine Abfrage für die Mastertabelle ausgeführt wird, niemals Indizes verwendet werden. Wie kann ich es verbessern? Ich möchte alle meine Abfragen in meiner Haupttabelle stellen. Bei der Abfrage nach einem bestimmten Datum erwarte ich keinen Leistungsunterschied zwischen der Abfrage in der Mastertabelle oder der untergeordneten Tabelle.
test_20150812
vs. test_table_20150812
) zugunsten von Kurznamen aufzulösen . Sie haben vergessen, Ihre Version von Postgres anzugeben, und geben Sie EXPLAIN (ANALYZE, BUFFERS)
nicht nur die Ausgabe von an EXPLAIN
. Auch seltsam: Seq Scan on test_table_20150812 test_table
(jetzt vereinfacht test_20150812 test
) ist nicht gültig erklären Ausgabe ...