where절에 있는 서브쿼리 결과가 1개 이상인 경우
filter 방식 / join 방식 옵티마이저
filter 방식 - 메인 sql 데이터 만큼 서브쿼리가 돈다.
즉, 메인 sql 100만건 돈다면 일일이 서브쿼리에게 100만건 input 한다
(서브 쿼리의 결과가 1개라고 한다면 성능저하 되지는 않지만 그런 경우는 거의 없으므로
성능이 안좋은 쿼리라고 할 수 있다)
join 방식 - 메인 sql 양이 많고 서브 sql 의 양이 적을때
선 서브 sql 선 scan 하여 join 할수 있다.
하지만 nested loops join 이외 다른 join은 filter 방식에 대한 효과를 얻지 못한다.
(join 하고자하는 input 값이 적을땐 join 방식보다 filter 방식이 더 성능상 이점을 가질
수 있다)
스칼라 서브쿼리를 사용할 때 결과 추출값이 많을 때는
서브쿼리에서 조인으로 변경한 후 hash join 유도 하는게 좋다 (no index scan)
결과 추출값이 적을 때는 조인에서 부분 범위처리 (rownum >=10)를 선행 후
스칼라 서브쿼리로 바꾸는것이 I/O 처리량을 줄일 수 있다
관련 내용은 여기에 자세히
http://oracle10g.tistory.com/871
'Database > SQL Tuning' 카테고리의 다른 글
Pipelined Table & Table Function (0) | 2015.08.25 |
---|---|
[Merge] Update 컬럼은 On 절에 사용 할수 없을 때 (0) | 2015.08.24 |
Updatable join view / Merge / Instead of Trigger (0) | 2015.08.24 |
[BVP] Bind Variable Peaking 과 Adaptive Cursor Sharing (0) | 2015.08.20 |
옵티마이저를 이용한 SQL 튜닝 (0) | 2015.08.18 |