우분투 12.04에서 PostgreSQL 9.1을 사용합니다.
일정 시간 내에 레코드를 선택해야합니다. 테이블 time_limits
에는 두 개의 timestamp
필드와 하나의 integer
속성이 있습니다. 내 실제 테이블에는이 쿼리와 관련이없는 추가 열이 있습니다.
create table (
start_date_time timestamp,
end_date_time timestamp,
id_phi integer,
primary key(start_date_time, end_date_time,id_phi);
이 테이블은 대략 2M 레코드를 포함합니다.
다음과 같은 쿼리는 많은 시간이 걸렸습니다.
select * from time_limits as t
where t.id_phi=0
and t.start_date_time <= timestamp'2010-08-08 00:00:00'
and t.end_date_time >= timestamp'2010-08-08 00:05:00';
그래서 PK의 반대 인 또 다른 색인을 추가하려고했습니다.
create index idx_inversed on time_limits(id_phi, start_date_time, end_date_time);
성능이 향상되었다는 인상을 받았습니다. 테이블 중간에있는 레코드에 액세스하는 시간이 40 초에서 90 초 사이 인 것이 더 합리적입니다.
그러나 시간 범위 중간의 값은 여전히 수십 초입니다. 그리고 테이블의 끝을 목표로 할 때 (시간순으로) 두 번 더.
explain analyze
이 쿼리 계획을 처음으로 시도 했습니다.
Bitmap Heap Scan on time_limits (cost=4730.38..22465.32 rows=62682 width=36) (actual time=44.446..44.446 rows=0 loops=1)
Recheck Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
-> Bitmap Index Scan on idx_time_limits_phi_start_end (cost=0.00..4714.71 rows=62682 width=0) (actual time=44.437..44.437 rows=0 loops=1)
Index Cond: ((id_phi = 0) AND (start_date_time <= '2011-08-08 00:00:00'::timestamp without time zone) AND (end_date_time >= '2011-08-08 00:05:00'::timestamp without time zone))
Total runtime: 44.507 ms
검색을 최적화하려면 어떻게해야합니까? 당신은 모든 시간을 열 번이 타임 스탬프를 스캔하는 데 소요되는 볼 수 있습니다 id_phi
로 설정됩니다 0
. 타임 스탬프의 큰 스캔 (60K 행!)을 이해하지 못합니다. 기본 키로 색인을 생성하지 않았으며 idx_inversed
추가 했습니까?
타임 스탬프 유형에서 다른 것으로 변경해야합니까?
GIST 및 GIN 지수에 대해 조금 읽었습니다. 사용자 정의 유형의 특정 조건에서 더 효율적일 수 있습니다. 사용 사례에 적합한 옵션입니까?
explain analyze
출력에 보고 된 시간은 쿼리 가 서버에서 필요한 시간 입니다. 조회 45 초 정도 걸립니다 경우, 추가 시간이 62682 행의 각 행이 큰 경우 (예를 들어 긴 후 모든 쿼리를 실행하는 프로그램의 데이터베이스에서 데이터를 전송 소요되는 varchar
또는 text
열),이 수 전송 시간에 영향을 미칠 과감하게.
rows=62682 rows
은 플래너의 추정치 입니다. 쿼리는 0 개의 행을 반환합니다. (actual time=44.446..44.446 rows=0 loops=1)