Oracle/Internal View2018. 3. 2. 13:38

VW_WIF 인터널 뷰를 살펴보자.


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

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

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


아래 쿼리는 점 이력의 최종 이력을 조회할 때 자주 사용되는 패턴이다. 실행 계획에서 VW_WIF 인터널 뷰를 확인할 수 있다. WIF는 WIndows Function의 약어로 추측된다. 

-- 2
SELECT a.*
  FROM t1 a, t2 b
 WHERE b.c1 = a.c1
   AND b.c2 = (SELECT MAX (x.c2)
                 FROM t2 x
                WHERE x.c1 = a.c1);

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


QT는 위 쿼리를 아래 쿼리로 변환한다. 분석 함수를 사용하여 집계 함수를 사용한 상관 서브 쿼리를 제거하는 것이다.

-- 3
SELECT c1, c2
  FROM (SELECT a.c1, a.c2, CASE b.c2 WHEN MAX (b.c2) OVER (PARTITION BY b.c1) THEN b.ROWID END vw_col_3
          FROM t1 a, t2 b
         WHERE b.c1 = a.c1) vw_wif_1
 WHERE vw_wif_1.vw_col_3 IS NOT NULL;


NO_UNNEST 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
-- 4
 SELECT a.*
  FROM t1 a, t2 b
 WHERE b.c1 = a.c1
   AND b.c2 = (SELECT /*+ NO_UNNEST */
                      MAX (x.c2)
                 FROM t2 x
                WHERE x.c1 = a.c1);

------------------------------------
| Id  | Operation           | Name |
------------------------------------
|   0 | SELECT STATEMENT    |      |
|*  1 |  FILTER             |      |
|*  2 |   HASH JOIN         |      |
|   3 |    TABLE ACCESS FULL| T1   |
|   4 |    TABLE ACCESS FULL| T2   |
|   5 |   SORT AGGREGATE    |      |
|*  6 |    TABLE ACCESS FULL| T2   |
------------------------------------


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

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