PostgreSQL 9.2를 사용하면 비교적 큰 테이블 (2 억 + 백만 행)에서 느린 쿼리로 인해 문제가 발생합니다. 나는 미친 것을 시도하지 않고 역사적인 가치를 추가합니다. 아래는 쿼리 및 쿼리 계획 출력입니다.
내 테이블 레이아웃 :
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
귀하의 경우)도 종종 중복됩니다.