station_logs
PostgreSQL 9.6 데이터베이스에 테이블 이 있습니다.
Column | Type |
---------------+-----------------------------+
id | bigint | bigserial
station_id | integer | not null
submitted_at | timestamp without time zone |
level_sensor | double precision |
Indexes:
"station_logs_pkey" PRIMARY KEY, btree (id)
"uniq_sid_sat" UNIQUE CONSTRAINT, btree (station_id, submitted_at)
에 대해 level_sensor
에 대한 마지막 값 을 얻으려고합니다 . 약 400 개의 고유 한 값과 하루에 약 20k 개의 행이 있습니다.submitted_at
station_id
station_id
station_id
색인을 작성하기 전에 :
EXPLAIN ANALYZE
SELECT DISTINCT ON(station_id) station_id, submitted_at, level_sensor
FROM station_logs ORDER BY station_id, submitted_at DESC;
고유 (비용 = 4347852.14..4450301.72 행 = 89 너비 = 20) (실제 시간 = 22202.080..27619.167 행 = 98 루프 = 1) -> 정렬 (비용 = 4347852.14..4399076.93 행 = 20489916 너비 = 20) (실제 시간 = 22202.077..26540.827 행 = 20489812 루프 = 1) 정렬 키 : station_id, submission_at DESC 정렬 방법 : 외부 병합 디스크 : 681040kB -> station_logs의 Seq 스캔 (비용 = 0.00..598895.16 행 = 20489916 너비 = 20) (실제 시간 = 0.023..3443.587 행 = 20489812 루프 = $ 계획 시간 : 0.072ms 실행 시간 : 27690.644ms
색인 작성 :
CREATE INDEX station_id__submitted_at ON station_logs(station_id, submitted_at DESC);
동일한 쿼리에 대해 인덱스를 생성 한 후 :
고유 (비용 = 0.56..2156367.51 행 = 89 폭 = 20) (실제 시간 = 0.184..16263.413 행 = 98 루프 = 1) -> station_logs에서 station_id__submitted_at를 사용한 인덱스 스캔 (비용 = 0.56..2105142.98 행 = 20489812 너비 = 20) (실제 시간 = 0.181..1 $ 계획 시간 : 0.206 ms 실행 시간 : 16263.490ms
이 쿼리를 더 빠르게 만드는 방법이 있습니까? 예를 들어 1 초와 마찬가지로 16 초는 여전히 너무 큽니다.