Oracle/Internal View2018. 3. 2. 10:31

VW_LAT 인터널 뷰를 살펴보자.


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

-- 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);


테스트 전에 _optimizer_ansi_join_lateral_enhance 파라미터를 false로 설정하자. 해당 파라미터는 VW_DCL 인터날 뷰와 관련이 있다. 아래 쿼리의 실행 계획에서 VW_LAT 인터널 뷰를 확인할 수 있다. LAT는 LATeral의 약어다. Lateral View는 12.1 버전부터 사용할 수 있다.

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

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

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

Predicate Information (identified by operation id):
---------------------------------------------------
   6 - access("B"."C1"="A"."C1")


QT는 위 쿼리를 아래 쿼리로 변환한다.

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


ANSI 아우터 조인에 OR 일반 조건이 포함된 경우에도 해당 쿼리 변환이 발생할 수 있다.

-- 4
SELECT a.c1, b.c2
  FROM t1 a
  LEFT OUTER
  JOIN t2 b
    ON b.c1 = a.c1
   AND (   b.c2 = 1
        OR b.c3 BETWEEN 1 AND 2);

------------------------------------------------------------------
| Id  | Operation                              | Name            |
------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                 |
|   1 |  MERGE JOIN OUTER                      |                 |
|   2 |   TABLE ACCESS FULL                    | T1              |
|   3 |   BUFFER SORT                          |                 |
|   4 |    VIEW                                | VW_LAT_2E38C6CE |
|*  5 |     TABLE ACCESS BY INDEX ROWID BATCHED| T2              |
|*  6 |      INDEX RANGE SCAN                  | T2_X1           |
------------------------------------------------------------------


QT는 직전 쿼리를 아래 쿼리로 변환한다.

-- 5
SELECT a.c1, vw_lat_2e38c6ce.c2
  FROM t1 a
     , LATERAL
       (SELECT b.c2
          FROM t2 b
         WHERE b.c1 = a.c1
           AND (   b.c2 = 1
                OR     b.c3 >= 1
                   AND b.c3 <= 2))(+) vw_lat_2e38c6ce;


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

VW_ORE 인터널 뷰  (0) 2018.03.02
VW_NSO 인터널 뷰  (0) 2018.03.02
VW_JF 인터널 뷰  (0) 2018.03.02
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰  (0) 2018.03.02
VW_FOJ 인터널 뷰  (0) 2018.03.02
Posted by 정희락_