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

VW_SSQ 인터널 뷰를 살펴보자.


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

-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
 
CREATE TABLE t1 (c1 NUMBER, c2 NUMBER);
CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);


아래 쿼리의 실행 계획에서 VW_SSQ 인터널 뷰를 확인할 수 있다. SSQ는 Scalar SubQuery의 약어다. 해당 기능은 12.1.0.2 버전에 추가된 것으로 보인다.

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

SELECT a.c1
     , (SELECT MAX (x.c2)
          FROM t2 x
         WHERE x.c1 = a.c1) AS c2
  FROM t1 a;
 
-----------------------------------------
| Id  | Operation            | Name     |
-----------------------------------------
|   0 | SELECT STATEMENT     |          |
|*  1 |  HASH JOIN OUTER     |          |
|   2 |   TABLE ACCESS FULL  | T1       |
|   3 |   VIEW               | VW_SSQ_1 |
|   4 |    HASH GROUP BY     |          |
|   5 |     TABLE ACCESS FULL| T2       |
-----------------------------------------


QT는 위 쿼리를 아래 쿼리로 변환한다. 해당 쿼리 변환은 비효율적으로 수행되는 스칼라 서브 쿼리의 성능을 개선할 수 있지만, 스칼라 서브 쿼리의 테이블이 큰 경우 오히려 쿼리의 성능을 저하될 수도 있다.

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


NO_UNNEST 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
-- 4
SELECT a.c1
     , (SELECT /*+ NO_UNNEST */
               MAX (x.c2)
          FROM t2 x
         WHERE x.c1 = a.c1) AS c2
  FROM t1 a;
 
-----------------------------------
| Id  | Operation          | Name |
-----------------------------------
|   0 | SELECT STATEMENT   |      |
|   1 |  SORT AGGREGATE    |      |
|*  2 |   TABLE ACCESS FULL| T2   |
|   3 |  TABLE ACCESS FULL | T1   |
-----------------------------------


비등가 조인 조건이 존재하거나 스칼라 서브 쿼리의 결과가 가공된 경우에는 해당 쿼리 변환이 동작하지 않는다.

-- 5-1
SELECT a.c1
     , (SELECT /*+ UNNEST */
               MAX (x.c2)
          FROM t2 x
         WHERE x.c1 = a.c1
           AND x.c2 > a.c2) AS c2
  FROM t1 a;
 
-----------------------------------
| Id  | Operation          | Name |
-----------------------------------
|   0 | SELECT STATEMENT   |      |
|   1 |  SORT AGGREGATE    |      |
|*  2 |   TABLE ACCESS FULL| T2   |
|   3 |  TABLE ACCESS FULL | T1   |
-----------------------------------

-- 5-2
SELECT a.c1
     , (SELECT /*+ UNNEST */
               MAX (x.c2)
          FROM t2 x
         WHERE x.c1 = a.c1) || NULL AS c2
  FROM t1 a;
 
-----------------------------------
| Id  | Operation          | Name |
-----------------------------------
|   0 | SELECT STATEMENT   |      |
|   1 |  SORT AGGREGATE    |      |
|*  2 |   TABLE ACCESS FULL| T2   |
|   3 |  TABLE ACCESS FULL | T1   |
-----------------------------------


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

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