VW_JF 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 number); CREATE TABLE t2 (c1 NUMBER, c2 number);
아래 쿼리의 실행 계획에서 VW_JF 인터널 뷰를 확인할 수 있다. FACTORIZE_JOIN 힌트에서 JF가 Join Factorize의 약자임을 유추할 수 있다. 해당 쿼리 변환은 11.2.0.1 버전에 추가된 것으로 보인다.
-- 2 ALTER SESSION SET "_optimizer_join_factorization" = true; SELECT a.* FROM t1 a, t2 b WHERE a.c1 = 1 AND b.c2 = a.c2 UNION ALL SELECT a.* FROM t1 a, t2 b WHERE a.c1 = 2 AND b.c2 = a.c2; --------------------------------------------------- | Id | Operation | Name | --------------------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN | | | 2 | TABLE ACCESS FULL | T2 | | 3 | VIEW | VW_JF_SET$623BBB07 | | 4 | UNION-ALL | | |* 5 | TABLE ACCESS FULL| T1 | |* 6 | TABLE ACCESS FULL| T1 | --------------------------------------------------- Outline Data ------------- FACTORIZE_JOIN(@"SET$1"("B"@"SEL$1" "B"@"SEL$2"))
QT는 위 쿼리를 아래 쿼리로 변환한다. UNION ALL 연산을 먼저 수행하여 t2 테이블에 대한 액세스를 감소시키는 것이다.
-- 3 SELECT vw_jf_set$623bbb07.c1 , vw_jf_set$623bbb07.c2 FROM (SELECT a.c1, a.c2 FROM t1 a WHERE a.c1 = 1 UNION ALL SELECT a.c1, a.c2 FROM t1 a WHERE a.c1 = 2) vw_jf_set$623bbb07 , t2 b WHERE b.c2 = vw_jf_set$623bbb07.c2;
NO_FACTORIZE_JOIN 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
-- 4 SELECT /*+ NO_FACTORIZE_JOIN(@SET$1) */ a.* FROM t1 a, t2 b WHERE a.c1 = 1 AND b.c2 = a.c2 UNION ALL SELECT a.* FROM t1 a, t2 b WHERE a.c1 = 2 AND b.c2 = a.c2; ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | SELECT STATEMENT | | | 1 | UNION-ALL | | |* 2 | HASH JOIN | | |* 3 | TABLE ACCESS FULL| T1 | | 4 | TABLE ACCESS FULL| T2 | |* 5 | HASH JOIN | | |* 6 | TABLE ACCESS FULL| T1 | | 7 | TABLE ACCESS FULL| T2 | ------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_NSO 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_LAT 인터널 뷰 (0) | 2018.03.02 |
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰 (0) | 2018.03.02 |
VW_FOJ 인터널 뷰 (0) | 2018.03.02 |
VW_DTP 인터널 뷰 (0) | 2018.03.01 |