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 |