안녕하세요.
아래 쿼리에서 최적의 실행계획은 b테이블을 reg_date 인덱스를 이용해 스캔한뒤 a테이블을 join하면서 조건에 만족하는 10개를 뽑은뒤 stop하는 건데요.
문제는 reg_date의 범위가 어느정도를 넘어가면 무슨짓을 해도 a테이블을 풀스캔하는 hash조인으로 실행됩니다.
eanble_seqscan값을 false로 해도 a테이블의 pk인덱스를 사용해서 읽네요 . a테이블을 먼저 스켄하겠다는 강한 의지가 느껴집니다;;
실제 쿼리는 from절에 테이블이 5개정도 되고 인라인뷰와 스칼라쿼리등 좀 복잡한 쿼리라서 옵티마이저가 잘못판단하는걸로 보이는데요.
이런경우 먼저 스캔하는 테이블을 지정할수 있는 방법이 있나요?
8.3버전이고 통계정보는 갱신되고 있습니다.
조언부탁드립니다.
select *
from a, b
where a.idx=b.idx
and a.reg_date between '2010-01-01' and '2010-01-27'
and b.name like '%태희%'
order by reg_date limit 10;
|