VW_SSQ 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
1 2 3 4 5 6 |
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER); |
아래 쿼리의 실행 계획에서 VW_SSQ 인터널 뷰를 확인할 수 있다. SSQ는 Scalar SubQuery의 약어다. 해당 기능은 12.1.0.2 버전에 추가된 것으로 보인다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- 2 ALTER SESSION SET "_optimizer_unnest_scalar_sq" = true ; SELECT a.c1 , ( SELECT MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1) AS c2 FROM t1 a; ----------------------------------------- | Id | Operation | Name | ----------------------------------------- | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN OUTER | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | VW_SSQ_1 | | 4 | HASH GROUP BY | | | 5 | TABLE ACCESS FULL | T2 | ----------------------------------------- |
QT는 위 쿼리를 아래 쿼리로 변환한다. 해당 쿼리 변환은 비효율적으로 수행되는 스칼라 서브 쿼리의 성능을 개선할 수 있지만, 스칼라 서브 쿼리의 테이블이 큰 경우 오히려 쿼리의 성능을 저하될 수도 있다.
1 2 3 4 5 6 7 |
-- 3 SELECT a.c1, vw_ssq_1.c2 FROM ( SELECT x.c1, MAX (x.c2) AS c2 FROM t2 x GROUP BY x.c1) vw_ssq_1 , t1 a WHERE vw_ssq_1.c1(+) = a.c1; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-- 4 SELECT a.c1 , ( SELECT /*+ NO_UNNEST */ MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1) AS c2 FROM t1 a; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | TABLE ACCESS FULL | T2 | | 3 | TABLE ACCESS FULL | T1 | ----------------------------------- |
비등가 조인 조건이 존재하거나 스칼라 서브 쿼리의 결과가 가공된 경우에는 해당 쿼리 변환이 동작하지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
-- 5-1 SELECT a.c1 , ( SELECT /*+ UNNEST */ MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1 AND x.c2 > a.c2) AS c2 FROM t1 a; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | TABLE ACCESS FULL | T2 | | 3 | TABLE ACCESS FULL | T1 | ----------------------------------- -- 5-2 SELECT a.c1 , ( SELECT /*+ UNNEST */ MAX (x.c2) FROM t2 x WHERE x.c1 = a.c1) || NULL AS c2 FROM t1 a; ----------------------------------- | Id | Operation | Name | ----------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | TABLE ACCESS FULL | T2 | | 3 | TABLE ACCESS FULL | T1 | ----------------------------------- |
'Oracle > Internal View' 카테고리의 다른 글
VW_WIF 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_TE 인터널 뷰 (0) | 2018.03.02 |
VW_SQ 인터널 뷰 (0) | 2018.03.02 |
VW_ORE 인터널 뷰 (0) | 2018.03.02 |
VW_NSO 인터널 뷰 (0) | 2018.03.02 |