TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |