Mit PostgreSQL 9.2 habe ich Probleme mit langsamen Abfragen in einer relativ großen Tabelle (mehr als 200 Millionen Zeilen). Ich versuche nichts Verrücktes, sondern füge nur historische Werte hinzu. Unten finden Sie die Abfrage und die Ausgabe des Abfrageplans.
Mein Tabellenlayout:
Table "public.energy_energyentry"
Column | Type | Modifiers
-----------+--------------------------+-----------------------------------------------------------------
id | integer | not null default nextval('energy_energyentry_id_seq'::regclass)
prop_id | integer | not null
timestamp | timestamp with time zone | not null
value | double precision | not null
Indexes:
"energy_energyentry_pkey" PRIMARY KEY, btree (id)
"energy_energyentry_prop_id" btree (prop_id)
"energy_energyentry_prop_id_timestamp_idx" btree (prop_id, "timestamp")
Foreign-key constraints:
"energy_energyentry_prop_id_fkey" FOREIGN KEY (prop_id) REFERENCES gateway_peripheralproperty(id) DEFERRABLE INITIALLY DEFERRED
Die Daten reichen vom 01.01.2012 bis jetzt, wobei ständig neue Daten hinzugefügt werden. Der Fremdschlüssel enthält ungefähr 2,2.000 unterschiedliche Werte prop_id
, die gleichmäßig verteilt sind.
Ich stelle fest, dass die Zeilenschätzungen nicht weit entfernt sind, aber die Kostenschätzungen um den Faktor 4x größer erscheinen. Dies ist wahrscheinlich kein Problem, aber kann ich etwas dagegen tun?
Ich gehe davon aus, dass der Festplattenzugriff das Problem sein könnte, da sich die Tabelle nicht immer im Speicher befindet.
EXPLAIN ANALYZE
SELECT SUM("value")
FROM "energy_energyentry"
WHERE
"prop_id"=82411
AND "timestamp">'2014-06-11'
AND "timestamp"<'2014-11-11'
;
Aggregate (cost=214481.45..214481.46 rows=1 width=8) (actual time=51504.814..51504.814 rows=1 loops=1) -> Index Scan using energy_energyentry_prop_id_timestamp_idx on energy_energyentry (cost=0.00..214434.08 rows=18947 width=8) (actual time=136.030..51488.321 rows=13578 loops=1) Index Cond: ((prop_id = 82411) AND ("timestamp" > '2014-06-11 00:00:00+00'::timestamp with time zone) AND ("timestamp" < '2014-11-11 00:00:00+00'::timestamp with time zone)) Total runtime: 51504.841 ms
Irgendwelche Vorschläge, wie man das schneller macht?
Mir geht es auch gut, wenn ich nur höre, dass ich nichts Seltsames getan habe.
prop_time_idx
, aber die Tabellendefinition zeigt entry_prop_id_timestamp_idx
. Ist das der gleiche Index? Bitte repariere.
prop
)? Wenn nur ein kleiner Prozentsatz, wäre vielleicht ein Index ("timestamp", prop)
besser. prop
Oft sind auch mehrere Indizes mit denselben führenden Spalten ( in Ihrem Fall) redundant.