Sử dụng PostgreSQL 9.2, tôi gặp rắc rối với các truy vấn chậm trên một bảng tương đối lớn (hơn 200 triệu hàng). Tôi không thử bất cứ điều gì điên rồ, chỉ thêm các giá trị lịch sử. Dưới đây là truy vấn và đầu ra kế hoạch truy vấn.
Bố trí bảng của tôi:
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
Dữ liệu nằm trong khoảng từ 2012-01-01 đến nay, với dữ liệu mới liên tục được thêm vào. Có khoảng 2,2k giá trị riêng biệt trong prop_id
khóa ngoại, được phân bổ đều.
Tôi nhận thấy rằng các ước tính hàng không xa, nhưng ước tính chi phí dường như lớn hơn theo hệ số 4x. Đây có lẽ không phải là một vấn đề, nhưng tôi có thể làm gì về nó không?
Tôi hy vọng rằng việc truy cập đĩa có thể là vấn đề, vì bảng luôn không có trong bộ nhớ.
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
Bất kỳ đề xuất làm thế nào để làm điều này nhanh hơn?
Tôi cũng ổn khi chỉ nghe nói tôi đã không làm điều gì kỳ lạ.
prop_time_idx
, nhưng định nghĩa bảng hiển thị entry_prop_id_timestamp_idx
. Đây có phải là cùng một chỉ số? Hãy sửa chữa.
prop
)? Nếu chỉ là một tỷ lệ nhỏ, có thể một chỉ số trên ("timestamp", prop)
sẽ tốt hơn. Nhiều chỉ mục có cùng (các) cột hàng đầu ( prop
trong trường hợp của bạn) cũng thường là dự phòng.