Index Join 은 B*Tree Index Combination 이 Oracle 9i 에서 소개되기 전
( 정확하게 말하면 _B_TREE_BITMAP_PLAN Parameter 의 값이 False 에서 True로 바뀌기 전)
에 하나의 TAble 에 대해 여러 개의 Index 를 사용할 수 있는 유일한 방법이다.
Index Join 은 다음과 같은 실행 계획으로 표현된다.
Index Join 의 기본적인 Mechanism 은 Index 끼리 Hash Join 을 수행한다는 것이다.
아래와 같은 실행 계획을 가정해 보자.
---------------------------------------------------------------------------------
| Id | Operation | Name |
---------------------------------------------------------------------------------
| 1 | SORT AGGREGATE | |
| 2 | VIEW | index$_join$_001 |
| 3 | HASH JOIN | |
| 4 | HASH JOIN | |
| 5 | INDEX RANGE SCAN | T_BC1_I2 |
| 6 | INDEX RANGE SCAN | T_BC1_I3 |
| 7 | INDEX FAST FULL SCAN | T_BC1_I1 |
---------------------------------------------------------------------------------
Index Join 의 가장 큰 장점은 하나의 Table 에 대해 여러 개의 Index 를 사용할 수 있다는
것이다. 하지만 Oracle 의 의도와는 달리 Index Join 은 그다지 선호되지 않는 Scan 방식이다.
그 이유를 정리하면 다음과 같다.
B*Tree Index Combination 기능이 추가됨으로써 Index Join 은 더욱 그 존재 의미를
잃게 되었다. B*Tree Index Combination 은 Index Join 과 비슷한 일을 하지만
효율적인 경우가 많다.
B*Tree Index Combination VS Index Join
...
Index Join 은 INDEX_JOIN Hint 를 통해서 제어한다.
select /*+ index_join(t1) */ c1 from t1 ..
select /*+ index_join(t1 t1_n1 t1_n2) */ c1 from t1 ...
select /*+ index_join(t1 t1(c1) c1(c2) */ c1 from t1 ...
Index Join 의 동작 여부는 _INDEX_JOIN_ENABLED Parameter 를 이용해서 제어할 수 있다.
SQL> @check_hidden_parameter.sql
Enter value for input_parameter: _index_join_enabled
old 15: a.ksppinm LIKE '&input_parameter'
new 15: a.ksppinm LIKE '_index_join_enabled'
Parameter Session Value Instance Value
------------------------------------------------------------ ------------------------------ ------------------------------
_index_join_enabled TRUE TRUE