Oracle/Internal View2018. 3. 2. 09:46

VW_GBC, VW_GBF 인터널 뷰를 살펴보자.


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

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

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

아래 쿼리의 실행 계획에서 VW_GBC 뷰를 확인할 수 있다. PLACE_GROUP_BY 힌트에서 GBC의 GB가 Group By의 약어임을 유추할 수 있다. 해당 쿼리 변환은 11.1.0.6 버전에 추가된 것으로 보인다.

-- 2-1
ALTER SESSION SET "_optimizer_group_by_placement" = true;

SELECT   /*+ QB_NAME(QB) PLACE_GROUP_BY(@QB(B@QB)) */
         a.c1, SUM (b.c1) AS sm
    FROM t1 a, t2 b
   WHERE b.c1 = a.c1
GROUP BY a.c1;

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

Outline Data
-------------
      PLACE_GROUP_BY(@"QB" ( "B"@"QB" ) 1)

QT는 위 쿼리를 아래 쿼리로 변환한다. t2 테이블을 먼저 그룹핑하여 조인 횟수를 감소시키는 것이다.

-- 2-2
SELECT   a.c1, SUM (vw_gbc_1.sm) AS sm
    FROM (SELECT   b.c1, SUM (b.c1) AS sm
              FROM t2 b
          GROUP BY b.c1) vw_gbc_1
       , t1 a
   WHERE vw_gbc_1.c1 = a.c1
GROUP BY a.c1

아래 쿼리의 실행 계획에서 VW_GBF 인터널 뷰를 확인할 수 있다. 12.1 버전부터 SUM 함수는 VW_GBC, COUNT 함수는 VW_GBF로 표시되는 것으로 보인다.

-- 3-1
SELECT   /*+ QB_NAME(QB) PLACE_GROUP_BY(@QB(B@QB)) */
         a.c1, COUNT (*) AS cn
    FROM t1 a, t2 b
   WHERE b.c1 = a.c1
GROUP BY a.c1;

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

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

-- 3-2
SELECT   a.c1, SUM (vw_gbf_1.cn) AS cn
    FROM (SELECT   b.c1, COUNT (*) AS cn
              FROM t2 b
          GROUP BY b.c1) vw_gbf_1
       , t1 a
   WHERE vw_gbf_1.c1 = a.c1
GROUP BY a.c1

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

-- 4
SELECT   /*+ NO_PLACE_GROUP_BY(@QB(B@QB)) */
         a.c1, COUNT (*) AS cn
    FROM t1 a, t2 b
   WHERE b.c1 = a.c1
GROUP BY a.c1;

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


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

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