이번 글에서는 VW_DTP 인터널 뷰를 살펴보자.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; DROP TABLE t2 PURGE; CREATE TABLE t1 (c1 NUMBER, c2 number); CREATE TABLE t2 (c1 NUMBER, c2 number);
아래 쿼리의 실행 계획에서 VW_DTP 인터널 뷰를 확인할 수 있다. PLACE_DISTINCT 힌트에서 DTP가 DisTinct Place의 약어임을 유추할 수 있다. 해당 쿼리 변환은 11.2.0.1 버전에 추가된 것으로 보인다.
-- 2 ALTER SESSION SET "_optimizer_distinct_placement" = true; SELECT /*+ PLACE_DISTINCT */ DISTINCT a.c2, b.c2 FROM t1 a, t2 b WHERE b.c1 = a.c1; ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | HASH UNIQUE | | |* 2 | HASH JOIN | | | 3 | TABLE ACCESS FULL | T1 | | 4 | VIEW | VW_DTP_F486F43F | | 5 | HASH UNIQUE | | | 6 | TABLE ACCESS FULL| T2 | ------------------------------------------------- Outline Data ------------- PLACE_DISTINCT(@"SEL$1" "B"@"SEL$1")
QT는 위 쿼리를 아래 쿼리로 변환한다. 조인 대상을 줄이기 위해 조인 전에 DISTINCT를 수행하는 것이다.
-- 3 SELECT DISTINCT a.c2, vw_dtp_f486f43f.c2 FROM (SELECT DISTINCT b.c1, b.c2 FROM t2 b) vw_dtp_f486f43f , t1 a WHERE vw_dtp_f486f43f.c1 = a.c1;
-- 4 SELECT /*+ NO_PLACE_DISTINCT */ DISTINCT a.c2, b.c2 FROM t1 a, t2 b WHERE b.c1 = a.c1; ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | SELECT STATEMENT | | | 1 | HASH UNIQUE | | |* 2 | HASH JOIN | | | 3 | TABLE ACCESS FULL| T1 | | 4 | TABLE ACCESS FULL| T2 | ------------------------------------
'Oracle > Internal View' 카테고리의 다른 글
VW_JF 인터널 뷰 (0) | 2018.03.02 |
---|---|
VW_GBC 인터널 뷰, VW_GBF 인터널 뷰 (0) | 2018.03.02 |
VW_FOJ 인터널 뷰 (0) | 2018.03.02 |
VW_DCL 인터널 뷰 (0) | 2018.01.12 |
VW_DAG 인터널 뷰 (0) | 2018.01.04 |