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 |