VW_ORE 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 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 오퍼레이션이 해당 오퍼레이션으로 대체된 것 같다.
-- 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 연산자를 사용하여 조건에 따라 실행 계획을 최적화하는 것이다.
-- 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 힌트를 사용하면 쿼리 변환을 방지할 수 있다.
-- 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 |