VW_WIF 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);
아래 쿼리는 점 이력의 최종 이력을 조회할 때 자주 사용되는 패턴이다. 실행 계획에서 VW_WIF 인터널 뷰를 확인할 수 있다. WIF는 WIndows Function의 약어로 추측된다.
-- 2 SELECT a.* FROM t1 a, t2 b WHERE b.c1 = a.c1 AND b.c2 = (SELECT MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1); ----------------------------------------- | Id | Operation | Name | ----------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | VIEW | VW_WIF_1 | | 2 | WINDOW SORT | | |* 3 | HASH JOIN | | | 4 | TABLE ACCESS FULL| T2 | | 5 | TABLE ACCESS FULL| T1 | -----------------------------------------
QT는 위 쿼리를 아래 쿼리로 변환한다. 분석 함수를 사용하여 집계 함수를 사용한 상관 서브 쿼리를 제거하는 것이다.
-- 3 SELECT c1, c2 FROM (SELECT a.c1, a.c2, CASE b.c2 WHEN MAX (b.c2) OVER (PARTITION BY b.c1) THEN b.ROWID END vw_col_3 FROM t1 a, t2 b WHERE b.c1 = a.c1) vw_wif_1 WHERE vw_wif_1.vw_col_3 IS NOT NULL;
-- 4 SELECT a.* FROM t1 a, t2 b WHERE b.c1 = a.c1 AND b.c2 = (SELECT /*+ NO_UNNEST */ MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1); ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | SELECT STATEMENT | | |* 1 | FILTER | | |* 2 | HASH JOIN | | | 3 | TABLE ACCESS FULL| T1 | | 4 | TABLE ACCESS FULL| T2 | | 5 | SORT AGGREGATE | | |* 6 | TABLE ACCESS FULL| T2 | ------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_BUSHY 인터널 뷰 (0) | 2018.08.28 |
---|---|
VM_NWVW 인터널 뷰 (0) | 2018.03.02 |
VW_TE 인터널 뷰 (0) | 2018.03.02 |
VW_SSQ 인터널 뷰 (0) | 2018.03.02 |
VW_SQ 인터널 뷰 (0) | 2018.03.02 |