11.2 버전까지 메인 쿼리에 서브 쿼리 팩토링을 사용하면 JPPD가 동작하지 않는 것으로 보인다.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER); CREATE INDEX t2_x1 ON t2 (c1);
아래 쿼리는 JPPD가 동작한다.
-- 2 SELECT /*+ LEADING(A) USE_NL(B) NO_MERGE(B) PUSH_PRED(B) */ a.* FROM t1 a , (SELECT c1, SUM (c2) AS c2 FROM t2 GROUP BY c1) b WHERE b.c1 = a.c1; ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW PUSHED PREDICATE | | |* 4 | FILTER | | | 5 | SORT AGGREGATE | | | 6 | TABLE ACCESS BY INDEX ROWID| T2 | |* 7 | INDEX RANGE SCAN | T2_X1 | -------------------------------------------------
아래 쿼리는 메인 쿼리에 서브 쿼리 팩토링을 사용했다. INLINE 방식으로 수행되었음에도 JPPD 동작하지 않는 것을 확인할 수 있다. 아직 workaround를 찾지 못했다. 인라인 뷰를 직접 기술하거나 임시 테이블을 사용해야 한다.
-- 3-1 WITH w1 AS (SELECT * FROM t1) SELECT /*+ LEADING(A) USE_NL(B) NO_MERGE(B) PUSH_PRED(B) */ a.* FROM w1 a , (SELECT c1, SUM (c2) AS c2 FROM t2 GROUP BY c1) b WHERE b.c1 = a.c1; ------------------------------------- | Id | Operation | Name | ------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS FULL | T1 | |* 3 | VIEW | | | 4 | SORT GROUP BY | | | 5 | TABLE ACCESS FULL| T2 | -------------------------------------
다행히 12.1 버전부터는 JPPD가 정상적으로 동작한다.
-- 3-2 WITH w1 AS (SELECT * FROM t1) SELECT /*+ LEADING(A) USE_NL(B) NO_MERGE(B) PUSH_PRED(B) */ * FROM w1 a , (SELECT c1, SUM (c2) AS c2 FROM t2 GROUP BY c1) b WHERE b.c1 = a.c1; --------------------------------------------------------- | Id | Operation | Name | --------------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW PUSHED PREDICATE | | |* 4 | FILTER | | | 5 | SORT AGGREGATE | | | 6 | TABLE ACCESS BY INDEX ROWID BATCHED| T2 | |* 7 | INDEX RANGE SCAN | T2_X1 | ---------------------------------------------------------
'Oracle > Tuning' 카테고리의 다른 글
PRECOMPUTE_SUBQUERY 힌트 (0) | 2018.12.14 |
---|---|
DB 링크 튜닝 기법 (0) | 2018.12.13 |
JPPD와 ROLLUP (0) | 2018.12.10 |
FK로 인한 DML 성능 저하 (0) | 2018.12.08 |
INDEX SCAN 방식에 따른 사용자 정의 함수 (0) | 2018.12.07 |