ใช้ PostgreSQL 9.2 ฉันมีปัญหากับการสืบค้นที่ช้าในตารางที่ค่อนข้างใหญ่ (200+ ล้านแถว) ฉันไม่ได้พยายามอะไรที่บ้าคลั่งเพียงแค่เพิ่มคุณค่าทางประวัติศาสตร์ ด้านล่างคือแบบสอบถามและผลลัพธ์แผนแบบสอบถาม
เค้าโครงตารางของฉัน:
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
ข้อมูลมีตั้งแต่ 2012-01-01 จนถึงปัจจุบันด้วยข้อมูลใหม่ที่เพิ่มเข้ามาอย่างต่อเนื่อง มีค่าต่างกันประมาณ 2.2k ในprop_id
คีย์ต่างประเทศซึ่งกระจายอย่างเท่าเทียมกัน
ฉันสังเกตเห็นว่าการประมาณแถวไม่ได้อยู่ไกล แต่การประมาณการต้นทุนดูใหญ่กว่าด้วยปัจจัย 4x นี่อาจไม่ใช่ปัญหา แต่มีอะไรที่ฉันทำได้บ้างไหม
ฉันคาดว่าการเข้าถึงดิสก์อาจเป็นปัญหาเนื่องจากตารางไม่ได้อยู่ในหน่วยความจำตลอดเวลา
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
ข้อเสนอแนะวิธีการทำให้เร็วขึ้น?
ฉันก็สบายดีที่เพิ่งได้ยินฉันไม่ได้ทำอะไรแปลก ๆ
prop_time_idx
entry_prop_id_timestamp_idx
นี่คือดัชนีเดียวกันหรือไม่ กรุณาแก้ไข
prop
) ถ้าเป็นเพียงเปอร์เซนต์เล็ก ๆ บางทีดัชนี("timestamp", prop)
อาจจะดีกว่า ดัชนีหลายรายการที่มีคอลัมน์นำเหมือนกัน ( prop
ในกรณีของคุณ) ก็มักจะซ้ำซ้อน