Usando PostgreSQL 9.2, ho problemi con le query lente su una tabella relativamente grande (oltre 200 milioni di righe). Non sto provando niente di folle, sto solo aggiungendo valori storici. Di seguito è riportata la query e l'output del piano di query.
Il mio layout del tavolo:
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
I dati vanno dal 01-01-2012 ad oggi, con l'aggiunta costante di nuovi dati. Ci sono circa 2.2k valori distinti nella prop_id
chiave esterna, distribuiti uniformemente.
Ho notato che le stime delle righe non sono lontane, ma le stime dei costi sembrano maggiori del fattore 4x. Questo probabilmente non è un problema, ma c'è qualcosa che potrei fare al riguardo?
Mi aspetto che l'accesso al disco potrebbe essere il problema, poiché la tabella non è in memoria per tutto il tempo.
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
Qualche suggerimento su come renderlo più veloce?
Sto bene anche solo sentendo che non ho fatto nulla di strano.
prop_time_idx
, ma mostra la definizione della tabella entry_prop_id_timestamp_idx
. È lo stesso indice? Per favore, aggiusta.
prop
)? Se solo una piccola percentuale, forse un indice su ("timestamp", prop)
sarebbe meglio. Anche gli indici multipli con le stesse colonne iniziali ( prop
nel tuo caso) sono spesso ridondanti.