VM_NWVW 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER); CREATE TABLE t2 (c2 NUMBER);
아래 쿼리의 실행 계획에서 VM_NWVW 인터널 뷰를 확인할 수 있다. VM은 View Merge, NWVW는 NeW VieW의 약어로 추측된다.
-- 2 ALTER SESSION SET "_complex_view_merging" = true; SELECT a.* FROM t1 a , (SELECT /*+ MERGE */ DISTINCT b.c2 FROM t2 b) b WHERE b.c2 = a.c1; ------------------------------------------ | Id | Operation | Name | ------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | VIEW | VM_NWVW_1 | | 2 | HASH UNIQUE | | |* 3 | HASH JOIN | | | 4 | TABLE ACCESS FULL| T1 | | 5 | TABLE ACCESS FULL| T2 | ------------------------------------------
QT는 위 쿼리를 아래 쿼리로 변환한다. 조인을 통해 DISTINCT할 데이터를 감소키는 것이다. 조인 대상이 많다면 오히려 성능이 저하될 수 있다.
-- 3 SELECT vm_nwvw_1.c1 FROM (SELECT DISTINCT a.ROWID, a.c1, b.c2 FROM t1 a, t2 b WHERE b.c2 = a.c1) vm_nwvw_1;
NO_MERGE 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
-- 4 SELECT a.* FROM t1 a , (SELECT /*+ NO_MERGE */ DISTINCT b.c2 FROM t2 b) b WHERE b.c2 = a.c1; ------------------------------------- | Id | Operation | Name | ------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | | | 4 | HASH UNIQUE | | | 5 | TABLE ACCESS FULL| T2 | -------------------------------------
아래는 12.1 버전의 실행계획이다. HASH SEMI JOIN으로 조인되는 것을 확인할 수 있다.
-- 5 ALTER SESSION SET "_optimizer_partial_join_eval" = true; SELECT a.* FROM t1 a , (SELECT /*+ MERGE */ DISTINCT b.c2 FROM t2 b) b WHERE b.c2 = a.c1; ------------------------------------------ | Id | Operation | Name | ------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | VIEW | VM_NWVW_1 | | 2 | HASH UNIQUE | | |* 3 | HASH JOIN SEMI | | | 4 | TABLE ACCESS FULL| T1 | | 5 | TABLE ACCESS FULL| T2 | ------------------------------------------ Outline Data ------------- PARTIAL_JOIN(@"SEL$3DD9CB74" "B"@"SEL$2")
-- 6 SELECT /*+ NO_PARTIAL_JOIN(@SEL$3DD9CB74 B@SEL$2) */ a.* FROM t1 a , (SELECT /*+ MERGE */ DISTINCT b.c2 FROM t2 b) b WHERE b.c2 = a.c1; ------------------------------------------ | Id | Operation | Name | ------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | VIEW | VM_NWVW_1 | | 2 | HASH UNIQUE | | |* 3 | HASH JOIN | | | 4 | TABLE ACCESS FULL| T1 | | 5 | TABLE ACCESS FULL| T2 | ------------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_BUSHY 인터널 뷰 (0) | 2018.08.28 |
---|---|
VW_WIF 인터널 뷰 (0) | 2018.03.02 |
VW_TE 인터널 뷰 (0) | 2018.03.02 |
VW_SSQ 인터널 뷰 (0) | 2018.03.02 |
VW_SQ 인터널 뷰 (0) | 2018.03.02 |