Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-14
제목 INDEX HINTS
INDEX HINTS
===========

인덱스 힌트 포맷은 대략 아래와 같다.

select /*+ index(TABLE_NAME INDEX_NAME) */ col1...

이러한 힌트사용에 대해 반드시 지켜야 하는 규칙이 있는데,
정리하면 아래와 같다.

[1] TABLE_NAME 은 반드시 써주어야 한다.

[2] 질의 문장에 테이블 ALIAS를 사용했다면, hint에도 테이블 ALIAS를
사용한다.

[3] 만약 TABLE_NAME이나 테이블 ALIAS의 spelling이 틀렸다면, hint를
사용하지 못하게 된다.

[4] INDEX_NAME 은 반드시 써줄 필요는 없다.

[5] 만일 TABLE_NAME없이 INDEX_NAME만 써주었다면, 힌트를 사용하지
못하게 된다

[6] 만일 TABLE_NAME만 써주었다면, OPTIMIZER는 STATISTICS를 참조하여
가장 적절한 인덱스를 결정한다.

[7] 만일 TABLE_NAME은 정확히 써주었으나, INDEX_NAME은 철자가 틀렸다면
OPTIMIZER는 힌트를 사용하지 못한다.

[8] PARSER/OPTIMIZER는 본래의 질의 문장을 PARSING 중 변형시킨다.
이 변형과정에서 PARSER/OPTIMIZER는 힌트로 준 INDEX를 사용하지 않는
ACCESS PATH를 결정할 수도 있다.



예제
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
아래의 예제들을 CBOTAB라는 테이블의 COL1 컬럼에 유니크 인덱스 CBOTAB1
있을 경우의 잘못된 힌트 사용예를 보인 것이다.


[1] TABLE_NAME 은 반드시 써주어야 한다.

SQL> explain plan for select /*+ index() */ col1 from cbotab;
Query Plan
----------------------------------------------------------------------
SELECT STATEMENT [CHOOSE] Cost=10
TABLE ACCESS FULL CBOTAB [ANALYZED] Cost=10 Card=10000 Bytes=100000



[2] 질의 문장에 테이블 ALIAS를 사용했다면, hint에도 테이블 ALIAS를
사용한다.

SQL> explain plan for select /*+ index(cbotab) */ col1
from cbotab mytable;
Query Plan
----------------------------------------------------------------------
SELECT STATEMENT [CHOOSE] Cost=10
TABLE ACCESS FULL CBOTAB [ANALYZED] Cost=10 Card=10000 Bytes=100000


[3] 만약 TABLE_NAME이나 테이블 ALIAS의 spelling이 틀렸다면, hint를
사용하지 못하게 된다.

SQL> explain plan for select /*+ index(COBTAB) */ col1
from cbotab;
SQL> explain plan for select /*+ index(MITABLE) */ col1
from cbotab mytable;
Query Plan
----------------------------------------------------------------------
SELECT STATEMENT [CHOOSE] Cost=10
TABLE ACCESS FULL CBOTAB [ANALYZED] Cost=10 Card=10000 Bytes=100000



[4] INDEX_NAME 은 반드시 써줄 필요는 없다.

See correct usage example.


[5] 만일 TABLE_NAME없이 INDEX_NAME만 써주었다면, 힌트를 사용하지
못하게 된다.

SQL> explain plan for select /*+ index(cbotab1) */ col1 from cbotab;
Query Plan
----------------------------------------------------------------------
SELECT STATEMENT [CHOOSE] Cost=10
TABLE ACCESS FULL CBOTAB [ANALYZED] Cost=10 Card=10000 Bytes=100000


[6] 만일 TABLE_NAME만 써주었다면, OPTIMIZER는 STATISTICS를 참조하여
가장 적절한 인덱스를 결정한다.

See correct usage example.


[7] 만일 TABLE_NAME은 정확히 써주었으나, INDEX_NAME은 철자가 틀렸다면
OPTIMIZER는 힌트를 사용하지 못한다.

SQL> explain plan for select /*+ index(cbotab COBTAB1) */ col1
from cbotab;
Query Plan
----------------------------------------------------------------------
SELECT STATEMENT [CHOOSE] Cost=10
TABLE ACCESS FULL CBOTAB [ANALYZED] Cost=10 Card=10000 Bytes=100000
Comment
등록된 코멘트가 없습니다.