Oracle/Internal View2018. 3. 2. 14:07

VM_NWVW 인터널 뷰를 살펴보자.


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

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

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


아래 쿼리의 실행 계획에서 VM_NWVW 인터널 뷰를 확인할 수 있다. VM은 View Merge, NWVW는 NeW VieW의 약어로 추측된다.

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

SELECT a.*
  FROM t1 a
     , (SELECT /*+ MERGE */
               DISTINCT
               b.c2
          FROM t2 b) b
 WHERE b.c2 = a.c1;

------------------------------------------
| Id  | Operation            | Name      |
------------------------------------------
|   0 | SELECT STATEMENT     |           |
|   1 |  VIEW                | VM_NWVW_1 |
|   2 |   HASH UNIQUE        |           |
|*  3 |    HASH JOIN         |           |
|   4 |     TABLE ACCESS FULL| T1        |
|   5 |     TABLE ACCESS FULL| T2        |
------------------------------------------


QT는 위 쿼리를 아래 쿼리로 변환한다. 조인을 통해 DISTINCT할 데이터를 감소키는 것이다. 조인 대상이 많다면 오히려 성능이 저하될 수 있다.

-- 3
SELECT vm_nwvw_1.c1
  FROM (SELECT DISTINCT
               a.ROWID, a.c1, b.c2
          FROM t1 a, t2 b
         WHERE b.c2 = a.c1) vm_nwvw_1;


NO_MERGE 힌트를 사용하면 쿼리 변환을 방지할 수 있다.

-- 4
SELECT a.*
  FROM t1 a
     , (SELECT /*+ NO_MERGE */
               DISTINCT
               b.c2
          FROM t2 b) b
 WHERE b.c2 = a.c1;

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


아래는 12.1 버전의 실행계획이다. HASH SEMI JOIN으로 조인되는 것을 확인할 수 있다.

-- 5
ALTER SESSION SET "_optimizer_partial_join_eval" = true;

SELECT a.*
  FROM t1 a
     , (SELECT /*+ MERGE */
               DISTINCT
               b.c2
          FROM t2 b) b
 WHERE b.c2 = a.c1;

------------------------------------------
| Id  | Operation            | Name      |
------------------------------------------
|   0 | SELECT STATEMENT     |           |
|   1 |  VIEW                | VM_NWVW_1 |
|   2 |   HASH UNIQUE        |           |
|*  3 |    HASH JOIN SEMI    |           |
|   4 |     TABLE ACCESS FULL| T1        |
|   5 |     TABLE ACCESS FULL| T2        |
------------------------------------------

Outline Data
-------------
      PARTIAL_JOIN(@"SEL$3DD9CB74" "B"@"SEL$2")


NO_PARTIAL_JOIN 힌트를 사용하면 HASH JOIN으로 조인할 수 있다.
-- 6
SELECT /*+ NO_PARTIAL_JOIN(@SEL$3DD9CB74 B@SEL$2) */
       a.*
  FROM t1 a
     , (SELECT /*+ MERGE */
               DISTINCT
               b.c2
          FROM t2 b) b
 WHERE b.c2 = a.c1;

------------------------------------------
| Id  | Operation            | Name      |
------------------------------------------
|   0 | SELECT STATEMENT     |           |
|   1 |  VIEW                | VM_NWVW_1 |
|   2 |   HASH UNIQUE        |           |
|*  3 |    HASH JOIN         |           |
|   4 |     TABLE ACCESS FULL| T1        |
|   5 |     TABLE ACCESS FULL| T2        |
------------------------------------------


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

VW_BUSHY 인터널 뷰  (0) 2018.08.28
VW_WIF 인터널 뷰  (0) 2018.03.02
VW_TE 인터널 뷰  (0) 2018.03.02
VW_SSQ 인터널 뷰  (0) 2018.03.02
VW_SQ 인터널 뷰  (0) 2018.03.02
Posted by 정희락_