Oracle/Internal View2018. 1. 4. 00:56

VW_DAG 인터널 뷰를 살펴보자.


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

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

아래 쿼리의 실행 계획에서 VW_DAG 인터널 뷰를 확인할 수 있다. TRANSFORM_DISTINCT_AGG 힌트에서 DAG가 Distinct AGgregation의 약어임을 유추할 수 있다. 해당 쿼리 변환은 11.2.0.1 버전에 추가된 것으로 보인다.

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

SELECT   c1, COUNT (DISTINCT c2) AS c2, COUNT (c3) AS c3
    FROM t1
GROUP BY c1;

-----------------------------------------
| Id  | Operation            | Name     |
-----------------------------------------
|   0 | SELECT STATEMENT     |          |
|   1 |  HASH GROUP BY       |          |
|   2 |   VIEW               | VW_DAG_0 |
|   3 |    HASH GROUP BY     |          |
|   4 |     TABLE ACCESS FULL| T1       |
-----------------------------------------

Outline Data
-------------
      TRANSFORM_DISTINCT_AGG(@"SEL$1")

TQ는 위 쿼리를 아래 쿼리로 변환한다.

-- 3
SELECT   c1, COUNT (c2) AS c2, NVL (SUM (c3), 0) AS c3
    FROM (SELECT   c1, c2, COUNT (c3) AS c3
              FROM t1
          GROUP BY c1, c2) vw_dag_0
GROUP BY c1


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

-- 4
SELECT   /*+ NO_TRANSFORM_DISTINCT_AGG */
         c1, COUNT (DISTINCT c2) AS c2, COUNT (c3) AS c3
    FROM t1
GROUP BY c1;

-----------------------------------
| Id  | Operation          | Name |
-----------------------------------
|   0 | SELECT STATEMENT   |      |
|   1 |  SORT GROUP BY     |      |
|   2 |   TABLE ACCESS FULL| T1   |
-----------------------------------


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

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