使用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年1月1日到现在,并且不断添加新数据。prop_id
外键中大约有2.2k个不同的值,分布均匀。
我注意到行估算值相差不远,但是成本估算值似乎大了4倍。这可能不是问题,但是我能做些什么吗?
我希望磁盘访问可能是个问题,因为表并非一直在内存中。
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
在您的情况下)通常也是多余的。