Oracle/Internal View2018. 8. 28. 00:25

VW_BUSHY 인터널 뷰를 살펴보자.


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

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

CREATE TABLE t1 AS SELECT ROWNUM AS c1 FROM XMLTABLE ('1 to 100');
CREATE TABLE t2 AS SELECT * FROM t1;
CREATE TABLE t3 AS SELECT * FROM t1;
CREATE TABLE t4 AS SELECT * FROM t1;

아래는 해시 조인의 일반적인 실행계획이다. 이런 유형의 실행 계획을 Left Deep Tree 방식이라고 한다.

-- 2
SELECT /*+ ORDERED */
       *
  FROM t1 a, t2 b, t3 c, t4 d
 WHERE b.c1 = a.c1
   AND c.c1 = b.c1
   AND d.c1 = c.c1;

-------------------------------------
| Id  | Operation            | Name |
-------------------------------------
|   0 | SELECT STATEMENT     |      |
|   1 |  HASH JOIN           |      |
|   2 |   HASH JOIN          |      |
|   3 |    HASH JOIN         |      |
|   4 |     TABLE ACCESS FULL| T1   |
|   5 |     TABLE ACCESS FULL| T2   |
|   6 |    TABLE ACCESS FULL | T3   |
|   7 |   TABLE ACCESS FULL  | T4   |
-------------------------------------

아래 쿼리는 SWAP_JOIN_INPUTS 힌트를 사용했다. 실행계획이 변경된 것을 확인할 수 있다. 이런 유형의 실행계획을 Right Deep Tree 방식이라고 한다.

-- 3
SELECT /*+ ORDERED SWAP_JOIN_INPUTS(C) SWAP_JOIN_INPUTS(D) */
       *
  FROM t1 a, t2 b, t3 c, t4 d
 WHERE b.c1 = a.c1
   AND c.c1 = b.c1
   AND d.c1 = c.c1;

-------------------------------------
| Id  | Operation            | Name |
-------------------------------------
|   0 | SELECT STATEMENT     |      |
|   1 |  HASH JOIN           |      |
|   2 |   TABLE ACCESS FULL  | T4   |
|   3 |   HASH JOIN          |      |
|   4 |    TABLE ACCESS FULL | T3   |
|   5 |    HASH JOIN         |      |
|   6 |     TABLE ACCESS FULL| T1   |
|   7 |     TABLE ACCESS FULL| T2   |
-------------------------------------

아래 쿼리는 인라인 뷰와 NO_MERGE 힌트를 사용했다. 이런 유형의 실행계획을 Bushy Tree 방식이라고 한다. 조건에 따라 세 가지 방식의 실행계획을 선택하여 사용할 수 있다.

-- 4
SELECT *
  FROM (SELECT /*+ NO_MERGE */ b.* FROM t1 a, t2 b WHERE b.c1 = a.c1) b
     , (SELECT /*+ NO_MERGE */ c.* FROM t3 c, t4 d WHERE d.c1 = c.c1) c
 WHERE c.c1 = b.c1;

-------------------------------------
| Id  | Operation            | Name |
-------------------------------------
|   0 | SELECT STATEMENT     |      |
|   1 |  HASH JOIN           |      |
|   2 |   VIEW               |      |
|   3 |    HASH JOIN         |      |
|   4 |     TABLE ACCESS FULL| T1   |
|   5 |     TABLE ACCESS FULL| T2   |
|   6 |   VIEW               |      |
|   7 |    HASH JOIN         |      |
|   8 |     TABLE ACCESS FULL| T3   |
|   9 |     TABLE ACCESS FULL| T4   |
-------------------------------------

12.2 버전부터 인라인 뷰을 사용하지 않고 BUSHY_JOIN 힌트를 통해 Bushy Tree 방식을 사용할 수 있다. 실행계획 5번에서 VW_BUSHY 인터널 뷰를 확인할 수 있다.

-- 5
SELECT /*+ QB_NAME(MAIN) BUSHY_JOIN(@MAIN (C@MAIN D@MAIN)) LEADING(A B) SWAP_JOIN_INPUTS(C) */
       *
  FROM t1 a, t2 b, t3 c, t4 d
 WHERE b.c1 = a.c1
   AND c.c1 = b.c1
   AND d.c1 = c.c1;

--------------------------------------------------
| Id  | Operation            | Name              |
--------------------------------------------------
|   0 | SELECT STATEMENT     |                   |
|   1 |  HASH JOIN           |                   |
|   2 |   HASH JOIN          |                   |
|   3 |    TABLE ACCESS FULL | T1                |
|   4 |    TABLE ACCESS FULL | T2                |
|   5 |   VIEW               | VW_BUSHY_7E92F0A1 |
|   6 |    HASH JOIN         |                   |
|   7 |     TABLE ACCESS FULL| T3                |
|   8 |     TABLE ACCESS FULL| T4                |
--------------------------------------------------

관련 힌트는 아래와 같다. 문서화되지 않은 힌트이므로 사용에 주의할 필요가 있다.

-- 6
SELECT name, inverse, version FROM v$sql_hint WHERE name = 'BUSHY_JOIN';

NAME       INVERSE       VERSION
---------- ------------- --------
BUSHY_JOIN NO_BUSHY_JOIN 12.2.0.1

1개의 행이 선택되었습니다.


아래는 해당 기능과 관련된 파라미터다. 기본적으로 비활성화되어 있다. (18.1 버전에서도 비활성되어 있다.)

-- 7
 NUM NAME                            VALUE  DESCRIPTION
---- ------------------------------- ------ ----------------------------------
3994 _optimizer_bushy_join           OFF    enables bushy join
3995 _optimizer_bushy_fact_dim_ratio 20     bushy join dimension to fact ratio
3996 _optimizer_bushy_fact_min_size  100000 minimumm fact size for bushy join
3997 _optimizer_bushy_cost_factor    100    cost factor for bushy join


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

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