VW_DCL 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER); CREATE TABLE t2 (c1 NUMBER, c2 NUMBER, c3 NUMBER); CREATE INDEX t2_x1 ON t2 (c1);
아래 쿼리의 실행 계획에서 VW_DCL 인터널 뷰를 확인할 수 있다. DECORRELATE 힌트에서 DCL이 DeCorreLate의 약어임을 유추할 수 있다. 해당 쿼리 변환은 12.1.0.1 버전에 추가된 것으로 보인다.
-- 2 ALTER SESSION SET "_optimizer_ansi_join_lateral_enhance" = true; SELECT a.c1, b.c3 FROM t1 a , LATERAL (SELECT MAX (b.c3) AS c3 FROM t2 b WHERE b.c1 = a.c1) b; ------------------------------------------------ | Id | Operation | Name | ------------------------------------------------ | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN OUTER | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | VW_DCL_A18161FF | | 4 | HASH GROUP BY | | | 5 | TABLE ACCESS FULL| T2 | ------------------------------------------------ Outline Data ------------- DECORRELATE(@"SEL$2") DECORRELATE(@"SEL$B1519A3D")
TQ는 위 쿼리를 아래 쿼리로 변환한다. LATERAL 인라인 뷰를 비상관(decorrelate) 인라인 뷰로 변경하여 독립적으로 수행하는 것으로 추정된다.
-- 3 SELECT a.c1, vw_dcl_a18161ff.c3 FROM t1 a , (SELECT b.c1, MAX (b.c3) AS c3 FROM t2 b GROUP BY b.c1) vw_dcl_a18161ff WHERE vw_dcl_a18161ff.c1(+) = a.c1;
해당 쿼리 변환은 경우에 따라 쿼리의 성능을 저하시킬 수 있다. NO_DECORRELATE 힌트를 사용하거나, _optimizer_ansi_join_lateral_enhance 파라미터를 false로 설정하면 쿼리 변환을 방지할 수 있다.
-- 4-1 SELECT /*+ NO_DECORRELATE(@SEL$2) */ a.c1, b.c3 FROM t1 a , LATERAL (SELECT MAX (b.c3) AS c3 FROM t2 b WHERE b.c1 = a.c1) b; ------------------------------------------------------------------ | Id | Operation | Name | ------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | VW_LAT_A18161FF | | 4 | SORT AGGREGATE | | | 5 | TABLE ACCESS BY INDEX ROWID BATCHED| T2 | |* 6 | INDEX RANGE SCAN | T2_X1 | ------------------------------------------------------------------ -- 4-2 SELECT /*+ OPT_PARAM('_optimizer_ansi_join_lateral_enhance', 'false') */ a.c1, b.c3 FROM t1 a , LATERAL (SELECT MAX (b.c3) AS c3 FROM t2 b WHERE b.c1 = a.c1) b; ------------------------------------------------------------------ | Id | Operation | Name | ------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS FULL | T1 | | 3 | VIEW | VW_LAT_A18161FF | | 4 | SORT AGGREGATE | | | 5 | TABLE ACCESS BY INDEX ROWID BATCHED| T2 | |* 6 | INDEX RANGE SCAN | T2_X1 | ------------------------------------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_JF 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰 (0) | 2018.03.02 |
VW_FOJ 인터널 뷰 (0) | 2018.03.02 |
VW_DTP 인터널 뷰 (0) | 2018.03.01 |
VW_DAG 인터널 뷰 (0) | 2018.01.04 |