VW_NSO 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER);
아래 쿼리의 실행 계획에서 VW_NSO 인터널 뷰를 확인할 수 있다. NSO는 Nested Subquery Optimisation의 약어로 알려져 있다.
-- 2 SELECT a.* FROM t1 a WHERE a.c2 IN (SELECT /*+ UNNEST */ MAX (x.c2) FROM t2 x GROUP BY x.c1); ----------------------------------------- | Id | Operation | Name | ----------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN SEMI | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | VW_NSO_1 | | 4 | HASH GROUP BY | | | 5 | TABLE ACCESS FULL| T2 | -----------------------------------------
QT는 위 쿼리를 아래 쿼리로 변환한다. 서브 쿼리를 unnesting한 후 view merging을 수행하지 않는다.
-- 3 SELECT a.c1, a.c2 FROM (SELECT MAX (x.c2) AS c2 FROM t2 x GROUP BY x.c1) vw_nso_1 , t1 a WHERE a.c2 = vw_nso_1.c2;
NO_UNNEST 힌트를 사용하면 필터 방식으로 수행되는 것을 확인할 수 있다.
-- 5 SELECT a.* FROM t1 a WHERE a.c2 IN (SELECT /*+ NO_UNNEST */ MAX (x.c2) FROM t2 x GROUP BY x.c1); ------------------------------------- | Id | Operation | Name | ------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | FILTER | | | 2 | TABLE ACCESS FULL | T1 | |* 3 | FILTER | | | 4 | HASH GROUP BY | | | 5 | TABLE ACCESS FULL| T2 | -------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_SQ 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_ORE 인터널 뷰 (0) | 2018.03.02 |
VW_LAT 인터널 뷰 (0) | 2018.03.02 |
VW_JF 인터널 뷰 (0) | 2018.03.02 |
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰 (0) | 2018.03.02 |