Oracle/Tuning2018. 12. 11. 11:31

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
Posted by 정희락_