Ich habe festgestellt, dass Postgres keinen Index für eine Bereichsabfrage in einer partitionierten Tabelle verwendet.Postgres verwendet keinen Index für Bereichsabfrage in partitionierter Tabelle
Die Eltern-Tabelle und ihre Partitionen werden mit ihrer Datumsspalte über btree indiziert.
Eine Abfrage wie folgt aus:
select * from parent_table where date >= '2015-07-01';
keine Indizes verwenden.
EXPLAIN
Ergebnis:
Append (cost=0.00..106557.52 rows=3263963 width=128)
-> Seq Scan on parent_table (cost=0.00..0.00 rows=1 width=640)
Filter: (date >= '2015-07-01'::date)
-> Seq Scan on z_partition_2015_07 (cost=0.00..106546.02 rows=3263922 width=128)
Filter: (date >= '2015-07-01'::date)
-> Seq Scan on z_partition_2015_08 (cost=0.00..11.50 rows=40 width=640)
Filter: (date >= '2015-07-01'::date)
Aber eine Abfrage wie folgt:
select * from parent_table where date = '2015-07-01'
verwendet einen Index.
EXPLAIN
Ergebnis:
Append (cost=0.00..30400.95 rows=107602 width=128)
-> Seq Scan on parent_table (cost=0.00..0.00 rows=1 width=640)
Filter: (date = '2015-07-01'::date)
-> Index Scan using z_partition_2015_07_date on z_partition_2015_07 (cost=0.43..30400.95 rows=107601 width=128)
Index Cond: (date = '2015-07-01'::date)
Wenn ich die Abfrage auf einem anderen normalen Tisch mit date
indiziert laufen, beide Abfragen verwenden Sie den Index.
Gibt es etwas Besonderes, dass wir auf partitionierte Tabelle Index tun sollten?
versuchen, das Datum zwischen der Bedingung –
zu verwenden. Zeigen Sie die EXPLAIN-Analysepläne für beide an. –
Schwer zu sagen, ohne über die Größe Ihrer Daten und deren Struktur zu wissen. Versuchen Sie zunächst 'VACUUM ANALYSE parent_table', um Statistiken zu Ihrer partitionierten Tabelle zu sammeln. Wenn es nicht half, versuchen Sie es in psql 'SET enable_seqscan = off 'und wiederholen Sie Ihre Abfrage. Der Planer sollte den Index-Scan verwenden, damit Sie die Kosten von seqscan und indexscan vergleichen können. Wahrscheinlich ist Seqscan einfach billiger für diese Art von Abfrage.Indexscan ist nicht sehr gut bei großen Datenmengen abgerufen werden. –