by 빈이 [Oracle Tuning] PARTITION INDEX [2017.04.17 11:02:37]
SELECT /*+ USE_NL(A B) INDEX(T1 IDX_ID_01) INDEX(T2 IDX_ID_01) */
*
FROM T1, T2
WHERE T1.ID IN (1,2,3)
AND T1.ID = T2.ID(+)
AND T2.COL2(+) = 'KKK';
위와 같은 SQL를 사용했습니다.
T2 테이블에는 CREATE_DT 필드에 PARTITION 분할을 하고 있습니다.
위 SQL을 사용하면 제가 원한 T2.ID 필드의 INDEX를 드라이빙하지 않고 PARTITION RANGE ALL을 드라이빙 하고 있더라구요.
문의드릴 내용은 PARTITION INDEX를 사용하지 않고 T2.IDX_ID_01의 INDEX를 강제로 태우고 싶습니다.
어떻게 힌트를 주면 제가 원하는 INDEX를 태울수 있을까요?
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=9 Card=1 Bytes=4K)
1 0 WINDOW (SORT) (Cost=9 Card=1 Bytes=4K)
2 1 NESTED LOOPS (OUTER) (Cost=6 Card=1 Bytes=4K)
3 2 INLIST ITERATOR
4 3 TABLE ACCESS (BY INDEX ROWID) OF 'TAB1' (Cost=1 Card=1 Bytes=4K)
5 4 INDEX (RANGE SCAN) OF 'PK_TAB1' (UNIQUE) (Cost=2 Card=1)
6 2 PARTITION RANGE (ALL)
7 6 TABLE ACCESS (FULL) OF 'TAB2' (Cost=5 Card=1 Bytes=167)
실행계획은 위와 같습니다.
T2에는 CREATE INDEX IDX_T2_ID_01 ON T2 (ID);
이렇게 제가 사용하고 싶은 INDEX가 1개 더 있습니다.
T2테이블의 PARTITION 은 T2.CREATE_dT <-- 필드에 월별로 분할해서 적용되어있습니다.