VW_ORE 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
1 2 3 4 |
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 NUMBER); CREATE INDEX t1_x1 ON t1 (C1); |
아래 쿼리의 실행 계획에서 VW_ORE 인터널 뷰를 확인할 수 있다. PLACE_DISTINCT 힌트에서 ORE가 OR Expand의 약어임을 유추할 수 있다. 12.2 버전부터 CONCATENATION 오퍼레이션이 해당 오퍼레이션으로 대체된 것 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- 2 VARIABLE v1 NUMBER; SELECT * FROM t1 WHERE c1 = NVL (:v1, c1); ------------------------------------------------------------------ | Id | Operation | Name | ------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | 1 | VIEW | VW_ORE_BA8ECEFB | | 2 | UNION - ALL | | |* 3 | FILTER | | | 4 | TABLE ACCESS BY INDEX ROWID BATCHED| T1 | |* 5 | INDEX RANGE SCAN | T1_X1 | |* 6 | FILTER | | |* 7 | TABLE ACCESS FULL | T1 | ------------------------------------------------------------------ Outline Data ------------- OR_EXPAND(@ "SEL$1" (1) (2)) |
QT는 위 쿼리를 아래 쿼리로 변환한다. UNION ALL 연산자를 사용하여 조건에 따라 실행 계획을 최적화하는 것이다.
1 2 3 4 5 6 7 8 9 10 11 |
-- 3 SELECT vw_ore_ba8ecefb.c1, vw_ore_ba8ecefb.c2 FROM (( SELECT c1, c2 FROM t1 WHERE :b1 IS NOT NULL AND c1 = :b2) UNION ALL ( SELECT c1, c2 FROM scott.t1 t1 WHERE :b3 IS NULL AND c1 IS NOT NULL )) vw_ore_ba8ecefb; |
NO_OR_EXPAND 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 |
-- 4 SELECT /*+ NO_OR_EXPAND */ * FROM t1 WHERE c1 = NVL (:v1, c1); ---------------------------------- | Id | Operation | Name | ---------------------------------- | 0 | SELECT STATEMENT | | |* 1 | TABLE ACCESS FULL | T1 | ---------------------------------- |
[관련 링크]
'Oracle > Internal View' 카테고리의 다른 글
VW_SSQ 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_SQ 인터널 뷰 (0) | 2018.03.02 |
VW_NSO 인터널 뷰 (0) | 2018.03.02 |
VW_LAT 인터널 뷰 (0) | 2018.03.02 |
VW_JF 인터널 뷰 (0) | 2018.03.02 |