Oracle/Internal View2018. 1. 12. 13:42

VW_DCL 인터널 뷰를 살펴보자.


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

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

CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER, c3 NUMBER);
CREATE INDEX t2_x1 ON t2 (c1);

아래 쿼리의 실행 계획에서 VW_DCL 인터널 뷰를 확인할 수 있다. DECORRELATE 힌트에서 DCL이 DeCorreLate의 약어임을 유추할 수 있다. 해당 쿼리 변환은 12.1.0.1 버전에 추가된 것으로 보인다.

-- 2
ALTER SESSION SET "_optimizer_ansi_join_lateral_enhance" = true;

SELECT a.c1, b.c3
  FROM t1 a
     , LATERAL
       (SELECT MAX (b.c3) AS c3
          FROM t2 b
         WHERE b.c1 = a.c1) b;

------------------------------------------------
| Id  | Operation            | Name            |
------------------------------------------------
|   0 | SELECT STATEMENT     |                 |
|*  1 |  HASH JOIN OUTER     |                 |
|   2 |   TABLE ACCESS FULL  | T1              |
|   3 |   VIEW               | VW_DCL_A18161FF |
|   4 |    HASH GROUP BY     |                 |
|   5 |     TABLE ACCESS FULL| T2              |
------------------------------------------------

Outline Data
-------------
      DECORRELATE(@"SEL$2")
      DECORRELATE(@"SEL$B1519A3D")

TQ는 위 쿼리를 아래 쿼리로 변환한다. LATERAL 인라인 뷰를 비상관(decorrelate) 인라인 뷰로 변경하여 독립적으로 수행하는 것으로 추정된다.

-- 3
SELECT a.c1, vw_dcl_a18161ff.c3
  FROM t1 a
     , (SELECT   b.c1, MAX (b.c3) AS c3
            FROM t2 b
        GROUP BY b.c1) vw_dcl_a18161ff
 WHERE vw_dcl_a18161ff.c1(+) = a.c1;

해당 쿼리 변환은 경우에 따라 쿼리의 성능을 저하시킬 수 있다. NO_DECORRELATE 힌트를 사용하거나, _optimizer_ansi_join_lateral_enhance 파라미터를 false로 설정하면 쿼리 변환을 방지할 수 있다.

-- 4-1
SELECT /*+ NO_DECORRELATE(@SEL$2) */
       a.c1, b.c3
  FROM t1 a
     , LATERAL
       (SELECT MAX (b.c3) AS c3
          FROM t2 b
         WHERE b.c1 = a.c1) b;

------------------------------------------------------------------
| Id  | Operation                              | Name            |
------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |
|   1 |  NESTED LOOPS                          |                 |
|   2 |   TABLE ACCESS FULL                    | T1              |
|   3 |   VIEW                                 | VW_LAT_A18161FF |
|   4 |    SORT AGGREGATE                      |                 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| T2              |
|*  6 |      INDEX RANGE SCAN                  | T2_X1           |
------------------------------------------------------------------

-- 4-2
SELECT /*+ OPT_PARAM('_optimizer_ansi_join_lateral_enhance', 'false') */
       a.c1, b.c3
  FROM t1 a
     , LATERAL
       (SELECT MAX (b.c3) AS c3
          FROM t2 b
         WHERE b.c1 = a.c1) b;
------------------------------------------------------------------
| Id  | Operation                              | Name            |
------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |
|   1 |  NESTED LOOPS                          |                 |
|   2 |   TABLE ACCESS FULL                    | T1              |
|   3 |   VIEW                                 | VW_LAT_A18161FF |
|   4 |    SORT AGGREGATE                      |                 |
|   5 |     TABLE ACCESS BY INDEX ROWID BATCHED| T2              |
|*  6 |      INDEX RANGE SCAN                  | T2_X1           |
------------------------------------------------------------------


'Oracle > Internal View' 카테고리의 다른 글

VW_JF 인터널 뷰  (0) 2018.03.02
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰  (0) 2018.03.02
VW_FOJ 인터널 뷰  (0) 2018.03.02
VW_DTP 인터널 뷰  (0) 2018.03.01
VW_DAG 인터널 뷰  (0) 2018.01.04
Posted by 정희락_