다음의 테이블이 있습니다.
test_table (
time time_stamp,
user bytea,
ip bigint,
name bytea
)
인덱스는 다음과 같습니다.
all_idx (time, user, ip, name)
user_idx (user, time)
ip_idx (ip, time)
name_idx (name, time)
약 2억5천만건 정도의 데이터가 입력되어 있다고 가정하게 되면...
SELECT 시에 기본 적으로 time 은 where 조건에 항상 들어 갑니다.
이외에 user, ip, name는 사용자 선택에 따라 WHERE 조건에 포함되거나 포함되지 않을 수 있습니다.
사용자가 ip를 지정하였을 경우의 SELECT문은 다음과 같습니다.
SELECT time, user, ip, name FROM test_table
WHERE
time >= '2008-07-09 12:00:00' and
time <= '2008-07-10 13:00:00' and
ip = 1023421
order by time limit 200;
위의 쿼리문이 실행되면 ip_idx 인덱스를 타게 되어 바로 결과가 출력됩니다.
user나 name의 경우에도 바로 출력 됩니다.
이번에 where 조건에 모두 포함되는 경우 입니다.
SELECT time, user, ip, name FROM test_table
WHERE
time >= '2008-07-09 12:00:00' and
time <= '2008-07-10 13:00:00' and
ip = 1023421 and
user = 'test' and
name = 'oldman'
order by time limit 200;
위의 where 조건에 해당하는 값이 결과값에 있다면 바로 결과가 출력됩니다. 인덱스는 all_idx를 타게 됩니다.
만약 user에 test라는 값이 결과 값에 존재하지 않는다면 all_idx를 타지 않고 user_idx를 타게 되던군요.. 마찬가지 결과가 바로 출력됩니다. 물론 아무런 값도 없겠지요.
제가 궁금한 것은요...
가령 where 조건의 IP의 값은 결과 값에 있습니다.
또한 where 조건의 user 값은 결과 값에 있구요..name 역시 마찬가지 입니다.
하지만 위 모두를 and 조건으로 하게되면 결과 값은 없습니다. 2억건이 데이터중에서 개별적으로는 있지만
and를 하게되면 없을 경우 에는 결과값이 굉장히 느리게 나오더라구요... 사실 너무 느려서 끝까지 기다려 보지도 않았습니다.
일일이 다 조합해보느라 굉장히 오래 걸리는 것 같습니다.. 처음부터 끝까지...
어떻게 하면 바로 결과를 볼 수 있을 까요..?
인덱스를 새롭게 줘야 할가요... 아니면... 혹시 Postgresql 설정 중에 시간을 설정하여 쿼리문의 결과가 늦게 되면 설정된 시간에 의해
그냥 쿼리문이 종료되는 ... 그러한 설정은 없나요.. 찾아보니 postgresql.conf에서 statement_timeout 값을 지정해주면 된다고 해서
해봤는데 되질 않네요...
참고로 postgresql 버전은 8.3.3을 쓰고 있습니다.
제가 구현하려는 것은요.. 테이블 하나에 수억건의 데이터가 쌓여도 인덱스에 의해 어떠한 조건으로도 빠르게 출력되는 방법을 찾고 있습니다.
소중한 답변 정중히 부탁드립니다. 감사합니다.
|