Oracle/Tuning2020. 1. 20. 09:10

메인 쿼리에 DB 링크를 사용하면 JPPD가 동작하지 않는 것으로 보인다. 아래는 예전에 쓴 JPPD에 대한 글이다.



테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
DROP TABLE t3 PURGE;

CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t3 (c1 NUMBER, c2 NUMBER);

CREATE INDEX t3_x1 ON t3 (c1);

t1 테이블에 DB 링크를 사용했고, c 인라인 뷰는 DB 링크를 사용하지 않은 t2 테이블과 조인했으나 JPPD가 동작하지 않는 것을 확인할 수 있다.

-- 2
SELECT /*+ ORDERED USE_NL(C) PUSH_PRED(C) */
       *
  FROM t1@dl1 a
     , t2 b
     , (SELECT   /*+ NO_MERGE */
                 c1
               , COUNT (*) AS cnt
            FROM t3
        GROUP BY c1) c
 WHERE b.c1 = a.c1
   AND c.c1 = b.c1;

-----------------------------------------------------
| Id  | Operation            | Name | Inst   |IN-OUT|
-----------------------------------------------------
|   0 | SELECT STATEMENT     |      |        |      |
|   1 |  NESTED LOOPS        |      |        |      |
|*  2 |   HASH JOIN          |      |        |      |
|   3 |    REMOTE            | T1   |    DL1 | R->S |
|   4 |    TABLE ACCESS FULL | T2   |        |      |
|*  5 |   VIEW               |      |        |      |
|   6 |    SORT GROUP BY     |      |        |      |
|   7 |     TABLE ACCESS FULL| T3   |        |      |
-----------------------------------------------------

12.1 이후 버전에서 LATERAL 뷰를 사용하는 것 외에는 해법이 없는 것으로 보인다.
-- 3
SELECT /*+ ORDERED USE_NL(C) PUSH_PRED(C) */
       *
  FROM t1@dl1 a
     , t2 b
     , LATERAL
       (SELECT   /*+ NO_MERGE */
               , COUNT (*) AS cnt
            FROM t3 x
           WHERE x.c1 = b.c1
        GROUP BY x.c1) c
 WHERE b.c1 = a.c1;

---------------------------------------------------------------
| Id  | Operation           | Name            | Inst   |IN-OUT|
---------------------------------------------------------------
|   0 | SELECT STATEMENT    |                 |        |      |
|   1 |  NESTED LOOPS       |                 |        |      |
|*  2 |   HASH JOIN         |                 |        |      |
|   3 |    REMOTE           | T1              |    DL1 | R->S |
|   4 |    TABLE ACCESS FULL| T2              |        |      |
|   5 |   VIEW              | VW_LAT_A18161FF |        |      |
|   6 |    SORT GROUP BY    |                 |        |      |
|*  7 |     INDEX RANGE SCAN| T3_X1           |        |      |
---------------------------------------------------------------


Posted by 정희락_