본문 바로가기
DataBase

지정한 힌트(HINT) 가 적용되지 않는 이유

by eqzero 2008. 12. 8.
오라클 HINT사용시 유의할점 몇가지...

1. 힌트에 대한 배경 설명

정확하게 정의된 힌트는, 옵티마이저에게 특정한 액세스 방법과 타입을 지정하는
DIRECTIVE가 된다. 옵티마이저는 항상 힌트에 지정된 사항을 무시하지 말고
지켜야 겠지만, 다음과 같은 이유에 의해 적용되지 않을 수 있다.

힌트는 다음과 같은 경우 적용되지 않는다:

1) 문법적으로 부정확 할 때. 만약 힌트의 문법이 틀리다면, 힌트를 단순 주석으로
처리하여 무시하게 된다.

2) 의미론적으로 부정활 할 때. 만약 힌트가 의미론적으로 부적절 할 경우 (예.
참조하는 대상이 invalid 상태에거나, unusable 상태인 경우, 또는 함께 사용하는
다른 힌트와 모순이 있을 때)

3) Rule 힌트는, Cost Based에서만 동작되는 기능을 사용할 경우 무시된다.

참조: Note.66484.1 Which Optimizer is Used ?
Oracle8i Release 2 (8.1.6) Designing and Tuning for Performance Manual Page 4-19
Part Number A76992-01.
Oracle9i Database Performance Guide and Reference Page 1-14
Part Number A87503-02.

만약 힌트가 적용되지 않고 무시된다면, 위에서 언급한 이유 때문일 것이며, 버그에
의해 그와 같은 문제가 발생하는 경우는 거의 없다.


2. Index 힌트

일반적으로 가장 많이 무시되는 힌트는 index 한트이다. <Note:50607.1>에
인덱스 힌트에 대한 좀더 상세한 정보가 담겨 있다. 힌트가 무시되는 가장
흔한 이유는 다음과 같다:

1) 테이블에 대한 alias가 아니라 테이블의 이름을 직접 사용하는 경우.
의미론 적으로 문제가 있기 때문에 무시된다 - 질의 내에서는 테이블에 대한
alias를 사용하여, 테이블 명을 직접 사용하지 않는데, 힌트에서는 테이블
명을 직접 사용함.

2) 인덱스에 대한 leading column을 지정하지 않은 경우
이 경우에도 의미론적으로 문제가 있기 때문에 무시된다 - 인덱스를 적용하기 곤란
그러나 일부 인덱스 메소드는 leading column이 지정 되지 않아도 사용 가능하다.
(예, Index Fast Full Scan이나 Index Full Scan)

3) Join 순서에 따라 leading index column 값이 base object를 액세스 하는 시점에서
결정되지 않을 경우. 예를 들어 Index Fast Full Scan이 사용되지 않은 상태에서
특정 Join 순서에 의해 사용하고자 하는 index의 컬럼 값이 결정되지 않는다면
그 인덱스를 사용할 수 없다. 인덱스가 사용 가능하기 위해서는 최소한 base object를
액세스 하는 시점에서 관련 index의 leading column 값이 결정 되어 있어야 한다.
이 경우 힌트는 의미론적으로 문제가 있기 때문에 무시될 수 있다. - 적용
가능하지 않은 인덱스를 참조

4) 묵시적인 타입 전환이 발생하는 것은, leading index column이 인덱스에 의해
사용될 수 없음을 의미한다. 이 힌트는 의미론적으로 부적절하기 때문에
무시된다 - 적용 가능하지 않은 인덱스 참조

질의 처리시 인덱스가 적용되지 않는 자세한 사례는 <Note:67522.1> 참조

3. Rule 힌트

Rule 힌트를 사용하면, 질의 처리시 Rule Based Optimizer를 사용하는 것을
시도한다. 하지만, Cost Based Optimizer에서만 사용가능한 기능이 있을 경우
이 힌트는 무시된다. CBO에서만 사용 가능한 기능에는 다음 내용이 포함
된다.

1) 질의 내에 포함된 테이블 가운데 병렬 처리 수준이 지정된 경우
(또는 병렬 처리 수준이 지정된 인덱스 8.0.5->8.1.5 <Note:70008.1 참조>)
2) Index Organized Table을 사용하는 경우
3) Partition Table을 사용하는 경우

동일한 힌트에 Rule 힌트와 함께 Cost Based Hint가 지정된 경우에도 Rule 힌트가
무시된다.

4.분석을 위한 제안

1) 다음 정보를 수집할 것

o 질의 문장
o 테이블과 뷰 그리고 연관된 인덱스의 정의 내역 (인덱스 정의시 컬럼 순서 포함)
o 질의에 대한 explain plan 내역

2) 점검 사항

o 힌트가 문법적으로 올바른지
o 실행되는 시점에서 leading index column 값이 결정되었는지
- join 순서가 중요
o leading index column 값에 대해 묵시적인 타입 변환이 발생 하는지
o CBO에서만 사용 가능한 기능이 존재하여 rule 힌트가 무시되는 것은 아닌지

[출처 : 오라클 포럼]

'DataBase' 카테고리의 다른 글

DB2 SQLSTATE 메시지  (0) 2009.04.03
오라클 DB 계정 생성  (0) 2009.02.02
테이블스페이스(TableSpace) Resize  (2) 2008.11.11
Oracle NLS 셋팅 정보 보기  (0) 2008.11.03
DB SESSION 정보 확인  (0) 2008.04.24