PostgreSQL 9.2 kullanarak, nispeten büyük bir tablo (200+ milyon satır) yavaş sorguları ile ilgili sorunlar var. Çılgınca bir şey denemiyorum, sadece tarihi değerler katıyorum. Sorgu ve sorgu planı çıktısı aşağıdadır.
Tablo düzenim:
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
Veriler 2012-01-01'den bugüne kadar değişmektedir ve sürekli olarak yeni veriler eklenmektedir. prop_id
Yabancı anahtarda eşit olarak dağılmış yaklaşık 2.2k farklı değer vardır .
Satır tahminlerinin çok uzakta olmadığını fark ettim, ancak maliyet tahminleri faktör 4x daha büyük görünüyor. Bu muhtemelen bir sorun değil, ancak bu konuda yapabileceğim bir şey var mı?
Tablo her zaman bellekte olmadığından, disk erişiminin sorun olabileceğini düşünüyorum.
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
Bunu nasıl daha hızlı hale getireceğinize dair herhangi bir öneriniz var mı?
Ben de sadece garip bir şey yapmadığımı duyuyorum.
prop_time_idx
, ancak tablo tanımı gösterir entry_prop_id_timestamp_idx
. Bu aynı indeks mi? Lütfen düzelt.
prop
)? Sadece küçük bir yüzde, belki bir endeksi ("timestamp", prop)
daha iyi olurdu. Aynı satır aralığı sütunlarına ( prop
sizin durumunuzda) sahip birden çok dizin de genellikle gereksizdir.