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

VW_JF 인터널 뷰를 살펴보자.


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

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

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


아래 쿼리의 실행 계획에서 VW_JF 인터널 뷰를 확인할 수 있다. FACTORIZE_JOIN 힌트에서 JF가 Join Factorize의 약자임을 유추할 수 있다. 해당 쿼리 변환은 11.2.0.1 버전에 추가된 것으로 보인다.

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

SELECT a.*
  FROM t1 a, t2 b
 WHERE a.c1 = 1
   AND b.c2 = a.c2
UNION ALL
SELECT a.*
  FROM t1 a, t2 b
 WHERE a.c1 = 2
   AND b.c2 = a.c2;

---------------------------------------------------
| Id  | Operation            | Name               |
---------------------------------------------------
|   0 | SELECT STATEMENT     |                    |
|*  1 |  HASH JOIN           |                    |
|   2 |   TABLE ACCESS FULL  | T2                 |
|   3 |   VIEW               | VW_JF_SET$623BBB07 |
|   4 |    UNION-ALL         |                    |
|*  5 |     TABLE ACCESS FULL| T1                 |
|*  6 |     TABLE ACCESS FULL| T1                 |
---------------------------------------------------

Outline Data
-------------
      FACTORIZE_JOIN(@"SET$1"("B"@"SEL$1" "B"@"SEL$2"))


QT는 위 쿼리를 아래 쿼리로 변환한다. UNION ALL 연산을 먼저 수행하여 t2 테이블에 대한 액세스를 감소시키는 것이다.

-- 3
SELECT vw_jf_set$623bbb07.c1
     , vw_jf_set$623bbb07.c2
  FROM (SELECT a.c1, a.c2
          FROM t1 a
         WHERE a.c1 = 1
        UNION ALL
        SELECT a.c1, a.c2
          FROM t1 a
         WHERE a.c1 = 2) vw_jf_set$623bbb07
     , t2 b
 WHERE b.c2 = vw_jf_set$623bbb07.c2;


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

-- 4
SELECT /*+ NO_FACTORIZE_JOIN(@SET$1) */
       a.*
  FROM t1 a, t2 b
 WHERE a.c1 = 1
   AND b.c2 = a.c2
UNION ALL
SELECT a.*
  FROM t1 a, t2 b
 WHERE a.c1 = 2
   AND b.c2 = a.c2;

------------------------------------
| Id  | Operation           | Name |
------------------------------------
|   0 | SELECT STATEMENT    |      |
|   1 |  UNION-ALL          |      |
|*  2 |   HASH JOIN         |      |
|*  3 |    TABLE ACCESS FULL| T1   |
|   4 |    TABLE ACCESS FULL| T2   |
|*  5 |   HASH JOIN         |      |
|*  6 |    TABLE ACCESS FULL| T1   |
|   7 |    TABLE ACCESS FULL| T2   |
------------------------------------


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

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