문서유형ㅣ기술정보
분야ㅣ튜닝
적용제품버전ㅣ6FS05, 6FS06, 6FS07, 6FS07PS, 7FS01, 7FS02, 7FS02PS
문서번호ㅣTTUTI013
개요
뷰를 호출하는 쿼리에서는 뷰 내에서 alias가 지정된 테이블에 대해 힌트(hint) 를 사용할 수 있습니다. (글로벌 힌트)
힌트를 활용해 뷰의 실행계획을 제어하는 방법을 안내합니다.
방법
힌트 작성 예시
- leading([뷰 alias].[뷰 내에 테이블 alias])
- index([뷰 alias].[뷰 내에 테이블 alias] [인덱스명]) */
힌트 사용 예시
1. 테스트 오브젝트 생성
create table tb1(c1 number, c2 number, c3 number); create unique index tb1_pk on tb1(c1); alter table tb1 add constraint tb1_pk primary key(c1); create table tb2(c1 number, c2 number, c3 number); create unique index tb2_pk on tb2(c1); alter table tb2 add constraint tb2_pk primary key(c1); create index tb_idx1 on tb1(c1, c2); create view v_test as select t1.c1 t1c1, t1.c2 t1c2, t2.c1 t2c1, t2.c2 t2c2 from tb1 t1, tb2 t2 where t1.c1 = t2.c1;
원본 SQL 실행 계획
SELECT * FROM V_TEST VT WHERE VT.T1C1 = 1;
Eecution Plan
------------------------------------------------------------------
1 NESTED LOOPS (Cost:5, %%CPU:0, Rows:1)
2 TABLE ACCESS (ROWID): TB2 (Cost:3, %%CPU:0, Rows:1)
3 INDEX (UNIQUE SCAN): TB2_PK (Cost:2, %%CPU:0, Rows:1)
4 INDEX (RANGE SCAN): TB_IDX1 (Cost:2, %%CPU:0, Rows:1)
Predicate Information
--------------------------------------------------------------------------------
1 - access: ("T1"."C1" = "T2"."C1") (1.000)
3 - access: ("T1"."C1" = 1) (0.010)
4 - access: ("T1"."C1" = 1) (0.010)
2. 힌트 적용
(1) leading 힌트
뷰 내에서 T1 alias 테이블이 먼저 수행되도록 실행 계획이 변경됩니다.
SELECT /*+ leading(VT.T1) */ * FROM V_TEST VT WHERE VT.T1C1 = 1;
Execution Plan
--------------------------------------------------------------------------------
1 NESTED LOOPS (Cost:5, %%CPU:0, Rows:1)
2 INDEX (RANGE SCAN): TB_IDX1 (Cost:2, %%CPU:0, Rows:1)
3 TABLE ACCESS (ROWID): TB2 (Cost:3, %%CPU:0, Rows:1)
4 INDEX (UNIQUE SCAN): TB2_PK (Cost:2, %%CPU:0, Rows:1)
Predicate Information
--------------------------------------------------------------------------------
1 - access: ("T1"."C1" = "T2"."C1") (1.000)
2 - access: ("T1"."C1" = 1) (0.010)
4 - access: ("T1"."C1" = 1) (0.010)(2) Index 힌트
뷰 내에서 T1 alias 테이블이 TB1_PK 인덱스를 사용하도록 실행 계획이 변경됩니다.
SELECT /*+ index(VT.T1 TB1_PK) */ * FROM V_TEST VT WHERE VT.T1C1 = 1;
Execution Plan
--------------------------------------------------------------------------------
1 NESTED LOOPS (Cost:6, %%CPU:0, Rows:1)
2 TABLE ACCESS (ROWID): TB2 (Cost:3, %%CPU:0, Rows:1)
3 INDEX (UNIQUE SCAN): TB2_PK (Cost:2, %%CPU:0, Rows:1)
4 TABLE ACCESS (ROWID): TB1 (Cost:3, %%CPU:0, Rows:1)
5 INDEX (UNIQUE SCAN): TB1_PK (Cost:2, %%CPU:0, Rows:1)
Predicate Information
--------------------------------------------------------------------------------
1 - access: ("T1"."C1" = "T2"."C1") (1.000)
3 - access: ("T1"."C1" = 1) (0.010)
5 - access: ("T1"."C1" = 1) (0.010)주의뷰 작성 시, 뷰 내에 동일한 alias를 지정하지 않습니다.