Oracle/Internal View2018. 3. 2. 11:24

VW_SQ 인터널 뷰를 살펴보자.


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

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

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


아래 쿼리의 실행 계획에서 VW_SQ 인터널 뷰를 확인할 수 있다. SQ는 SubQuery의 약어다.

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

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


QT는 위 쿼리를 아래 쿼리로 변환한다. VW_SQ 인터널 뷰는 상관 서브 쿼리, VW_NSO 인터널 뷰는 비상관 서브 쿼리에 대한 쿼리 변환을 표시하는 것으로 보인다.

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


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

-- 4
SELECT a.*
  FROM t1 a
 WHERE a.c2 = (SELECT /*+ NO_UNNEST */
                      MAX (x.c2)
                 FROM t2 x
                WHERE x.c1 = a.c1);

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


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

VW_TE 인터널 뷰  (0) 2018.03.02
VW_SSQ 인터널 뷰  (0) 2018.03.02
VW_ORE 인터널 뷰  (0) 2018.03.02
VW_NSO 인터널 뷰  (0) 2018.03.02
VW_LAT 인터널 뷰  (0) 2018.03.02
Posted by 정희락_