(11g+) 조인 조건 Pushdown과 VIEW PUSHED PREDICATE
옵티마이저는 쿼리 블록 단위로 최적화한다.
뷰를 변환하지 않고 그대로 두면, 뷰 쿼리 블록을 독립적으로 최적화한다.
그러면 당월 거래 전체를 읽어 고객 번호 수준으로 GRUOUP BY 한 후에 고객 테이블과 조인하므로 부분범위 처리가 불가능하다.
더 큰 문제는 고객 테이블에서 ‘전월 이후 가입한 고객’ 을 필터링하는 조건이 인라인 뷰 바깥에 있다는 사실이다.
이 조건이 있는데도 인라인 뷰 안에서는 당월에 거래한 ‘모든’ 고객의 거래 데이터를 읽어야 한다.
뷰 바깥에 있는 조건을 활용하기 위해 옵티마이저는 뷰를 메인 쿼리와 머징(Merging) 할 수 있다.
여기서는 뷰 머징한 거래 테이블을 고객과 해시 조인한 후에 GROUP BY 했지만, NL 조인으로 처리할 수도 있다.
고객을 기준으로 거래 테이블과 NL 조인하도록 유도하고 그 순서에 최적화된 인덱스를 구성해주면, 가입 일시 조건을 만족하는 고객의거래 중 거래일시 조건을 만족하는 데이터만 읽도록 구현할 수 있다.
그러나 여전히 부분범위 처리는 불가능하다. 조인에 성공한 전체 집합을 GROUP BY 하고서야 데이터를 출력할 수 있기 때문이다.
11g 이후 도입된 조인 조건 Pushdown (Query Transformation) 을 활용하면 지금까지 설명한 비효율을 한번에 해결할 수 있다. 이는 메인 쿼리를 실행하면서, 조인 조건절 값을 건건이 뷰 안으로 밀어넣는 기능이다. 이 기능이 작동하면 실행계획에 VIEW PUSHED PREDICATE 가 나타난다.
이 기능이 작동하면 조인 조건이 뷰 내부로 “밀어 넣어져” 불필요한 스캔/조인을 줄일 수 있다.