2017-12-27 9 views
1

두 개의 변수 val1과 val2 사이에 큰 상관 행렬을 저장하는 큰 Postgres 테이블 (150gb +)이 있습니다. 예 :대형 Postgres 상관 관계 테이블 쿼리

val1 | val2 | distance 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    0 | 1 |  10 
    0 | 2 |  21 
    0 | 3 |  13 
    1 | 2 |  65 
    1 | 3 |  43 
    2 | 3 |  56 

쌍 (val1, val2)은 테이블의 복합 기본 키입니다. 아래 쿼리를 실행할 때 쿼리가 35ms 미만에서 실행된다는 것을 알았습니다.

SELECT * 
FROM sliding_window_distances 
WHERE (val1 = 10000) 

그러나 val2를 사용하여 검색하면 실행되지 않고 시간이 초과됩니다.

SELECT * 
FROM sliding_window_distances 
WHERE (val2 = 10000) 

이상적으로 나는 (내 예제에서 10,000)를 특정 값에 대한 모든 기록을 가질 수 있도록 내가 쿼리를 빠르게하는 방법을 잘 모르겠어요

SELECT * 
FROM sliding_window_distances 
WHERE (val1 = 10000) 
OR (val2 = 10000) 

, 아래의 쿼리를 실행하려면 .

+0

가 추가 UNIQUE 제약 조건에 대한 추가 밖으로 잠그지 않고 인덱스를 생성하려면

테이블에 기록 (val2, val1). (이 색인을 만들 것입니다) – wildplasser

답변

1

시간 초과를 유발하는 다른 작업을 수행하기 전에 부실 캐시 데이터를 정리해야 할 수 있습니다.

첫 번째 유형 :

VACUUM ANALYZE sliding_window_distances; 

또한 당신이 당신의 테이블에 보조 인덱스를 사용해야합니다. 색인을 극적으로 생성하면 은 쿼리 작업을으로 가속화합니다.

CREATE INDEX CONCURRENTLY windows_dist_index ON sliding_window_distances (val2); 

당신은 또한 UNIQUE 제약 아래와 같이 추가로 정의 할 수 있습니다 :

ALTER TABLE sliding_window_distances ADD UNIQUE (val2, val1); 

PostgreSQL Documentation on Indexes

+0

안녕 GökcanD, 감사합니다 ... 인덱스를 생성하는 시간 초과로 나타납니다 ... 테이블이 매우 큽니다. – kPow989

+0

@ kPow989 우리가 볼 수있는 오류 로그가 있습니까? 또한 "진공"솔루션을 사용해보십시오. – gokcand

+0

고맙습니다. 복합 키 (val1, val2)는 이미 고유합니다 ... 색인 생성시 제한 시간이 생깁니다. 읽었을 때 완료까지 몇 시간이 걸릴 수도 있습니다. – kPow989