VW_DCL 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
1 2 3 4 5 6 7 |
-- 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 버전에 추가된 것으로 보인다.
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 |
-- 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) 인라인 뷰로 변경하여 독립적으로 수행하는 것으로 추정된다.
1 2 3 4 5 6 7 |
-- 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로 설정하면 쿼리 변환을 방지할 수 있다.
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 35 36 37 38 39 40 |
-- 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 |