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

VW_NSO 인터널 뷰를 살펴보자.


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

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

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


아래 쿼리의 실행 계획에서 VW_NSO 인터널 뷰를 확인할 수 있다. NSO는 Nested Subquery Optimisation의 약어로 알려져 있다.

-- 2
SELECT a.*
  FROM t1 a
 WHERE a.c2 IN (SELECT   /*+ UNNEST */
                         MAX (x.c2)
                    FROM t2 x
                GROUP BY x.c1);

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


QT는 위 쿼리를 아래 쿼리로 변환한다. 서브 쿼리를 unnesting한 후 view merging을 수행하지 않는다.

-- 3
SELECT a.c1, a.c2
  FROM (SELECT   MAX (x.c2) AS c2
            FROM t2 x
        GROUP BY x.c1) vw_nso_1
     , t1 a
 WHERE a.c2 = vw_nso_1.c2;


NO_UNNEST 힌트를 사용하면 필터 방식으로 수행되는 것을 확인할 수 있다.

-- 5
SELECT a.*
  FROM t1 a
 WHERE a.c2 IN (SELECT   /*+ NO_UNNEST */
                         MAX (x.c2)
                    FROM t2 x
                GROUP BY x.c1);

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


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

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