DB

선행 컬럼의 distnct 값이 많지 않은 경우(특히 일자) 튜닝 방법 한가지

Lawmin 2011. 9. 19. 17:02
1. 특정 테이블의 

date1은 YYYYMMDD 형식의 일자 형태의 문자열 컬럼 (8 byte)
table1은 수백만건

index: date1(col1)
select distinct 
date1
from    table1

date1에 index가 있더라도 index 전체를 읽어야 하기 때문에 일량이 크다.

-> YYYYMMDD 형식을 갖는 임의 테이블을 만들고 원 테이블의 MIN/MAX값을 범위로 지정하고, SEMI JOIN 방식으로 한 건씩 나올때 마다 루프에서 나오도록 튜닝
(temp_date 라는 테이블을 어느정도(table1을 모두 커버 가능한) 범위의 YYYYMMDD 값을 갖는 date2 라는 컬럼을 갖도록 만들고(인덱스 추가) 아래 SQL 처럼 튜닝 가능함)

select d.date2
from   temp_date d
where d.date2 between (select min(date1) from table1) and (select max(date1) from table1)
and    exists (select 1 from table1 where date2 = d.date1)