개요
뷰를 호출하는 쿼리에서는 뷰 내에서 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
복사
원본 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)
SQL
복사
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)
SQL
복사
(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)
SQL
복사
주의
뷰 작성 시, 뷰 내에 동일한 alias를 지정하지 않습니다.