0

입니다 :왜이 쿼리가 너무 느린가요? - - PostgreSQL의 SERIAL, TIMESTAMP 및 숫자에서 선택이 내 <code>measurement_pm2_5</code> 테이블 (6,2)

CREATE TABLE public.measurement_pm2_5 (
    sensor_id SERIAL, 
    measurement_time TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
    measurement_value NUMERIC(6,2) NOT NULL, 
    CONSTRAINT measurement_pm2_5_sensor_id_fkey FOREIGN KEY (sensor_id) 
    REFERENCES public.sensor(id) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    NOT DEFERRABLE 
) 
WITH (oids = false); 

그리고 이것은 내 쿼리입니다 :

select sensor_id, measurement_time, measurement_value 
FROM "public"."measurement_pm10" p, 
     (values(64,1476094463,1476116063),(129,1476094463,1476116063),(66,1476094463,1476116063),(130,1476094463,1476116063),(3,1476094463,1476116063),(131,1476094463,1476116063),(132,1476094463,1476116063),(133,1476094463,1476116063),(134,1476094463,1476116063),(135,1476094463,1476116063),(136,1476094463,1476116063),(137,1476094463,1476116063),(138,1476094463,1476116063),(139,1476094463,1476116063),(142,1476094463,1476116063),(17,1476094463,1476116063),(18,1476094463,1476116063),(19,1476094463,1476116063),(148,1476094463,1476116063),(94,1476094463,1476116063),(96,1476094463,1476116063),(101,1476094463,1476116063),(58,1476094463,1476116063),(59,1476094463,1476116063),(60,1476094463,1476116063),(63,1476094463,1476116063)) as t(sensor,t1,t2) 
WHERE p.sensor_id = t.sensor 
    AND measurement_time BETWEEN to_timestamp(t.t1) AND to_timestamp(t.t2); 

그것은에 약 16 초 정도 소요 데이터베이스를 실행하고 응답을 제공합니다. 약 3k 행을 반환합니다. 일반적으로이 테이블에는 260,000 개의 행이 있습니다.

더 빨리 만들 수있는 방법이 있습니까? 더 빨라서 1 초도 안되어 실행하겠습니까?

AWS의 무료 티어 PostgreSQL 데이터베이스를 사용합니다.

EXPLAIN (ANALYZE, BUFFER)

:

Hash Join (cost=0.65..8056.77 rows=5835 width=18) (actual time=15308.237..16039.319 rows=3035 loops=1) 
    Hash Cond: (p.sensor_id = "*VALUES*".column1) 
    Join Filter: ((p.measurement_time >= to_timestamp(("*VALUES*".column2)::double precision)) AND (p.measurement_time <= to_timestamp(("*VALUES*".column3)::double precision))) 
    Rows Removed by Join Filter: 182836 
    Buffers: shared hit=2330 
    -> Seq Scan on measurement_pm10 p (cost=0.00..5538.74 rows=321174 width=18) (actual time=0.007..1657.386 rows=321229 loops=1) 
     Buffers: shared hit=2327 
    -> Hash (cost=0.33..0.33 rows=26 width=12) (actual time=0.018..0.018 rows=26 loops=1) 
     Buckets: 1024 Batches: 1 Memory Usage: 10kB 
     -> Values Scan on "*VALUES*" (cost=0.00..0.33 rows=26 width=12) (actual time=0.002..0.010 rows=26 loops=1) 
Planning time: 0.560 ms 
Execution time: 16040.164 ms 
+1

아마 적절 : http://stackoverflow.com/a/39246869/251311 당신이'EXPLAIN ANALYZE'를 제공하면 좋을 것입니다. 추신 : 당신은 정말로 테이블에 인덱스가 없습니까? – zerkms

+0

@zerkms 링크 된 질문에 감사드립니다. CTE에 가입하여 쿼리 작성을 도와 주시겠습니까? 나는 내 조건을 어디에 두어야하는지 잘 모르겠습니다. 내 게시물을'EXPLAIN (ANALYZE, BUFFER)'로 업데이트했습니다. – Defozo

+1

글쎄, 적어도'sensor_id' 컬럼에 대한 인덱스를 추가해야합니다 (어쨌든 FK이므로), 업데이트 된 계획을 보여 주어야합니다. – zerkms

답변

0

당신이 타임 스탬프에 따라 값을 필터링대로 타임 스탬프에 클러스터되지 않은 인덱스를 만듭니다. 그게 분명히 도움이 될 것입니다

+1

모든 색인은 Postgres에서 "클러스터되지 않음"입니다. –