0
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
아마 적절 : http://stackoverflow.com/a/39246869/251311 당신이'EXPLAIN ANALYZE'를 제공하면 좋을 것입니다. 추신 : 당신은 정말로 테이블에 인덱스가 없습니까? – zerkms
@zerkms 링크 된 질문에 감사드립니다. CTE에 가입하여 쿼리 작성을 도와 주시겠습니까? 나는 내 조건을 어디에 두어야하는지 잘 모르겠습니다. 내 게시물을'EXPLAIN (ANALYZE, BUFFER)'로 업데이트했습니다. – Defozo
글쎄, 적어도'sensor_id' 컬럼에 대한 인덱스를 추가해야합니다 (어쨌든 FK이므로), 업데이트 된 계획을 보여 주어야합니다. – zerkms