Hint란?
Hint의 정의
- Optimizer가 항상 최적의 실행계획(Execution Plan)을 생성하지는 않음
- CBO가 주어진 쿼리에 대해서 최적의 Plan을 생성하는데 도움을 제공하는 키워드(훈수)
- SQL개발자가 액세스되는 User Data에 대해서 Optimizer보다 더 잘 안다고 가정
- Hint는 Query의 결과에 영향을 주지 않음
- 잘못 사용된 Hint는 Optimizer에 의해 무시됨(문법 오류 등)
- Hint는 /*+ RULE */을 제외하고는 항상 CBO를 호출
Hint의 사용규칙
- SQL 블록의 첫 키워드 바로 뒤에 입력
- 각 블록에는 하나의 Hint 주석만 있어야 함
- 하나의 Hint 주석은 여러 개의 Hint 포함 가능
- --+ Hint의 경우 Single Line에 모든 Hint를 기술해야 함
- Hint는 해당 블록에만 적용
- 문장에서 alias를 사용하는 경우 힌트는 그 alias를 참조
Hint의 SYNTAX
SELECT /*+ index(EMP IDX01) +/
EMP_NO, EMP_NM ...
FROM EMP
WHERE EMP_NM LIKE '신%'
SELECT /*+ use_nl(A B) +/
A.EMP_NO, A.EMP_NM, B.DEPT_NM
FROM EMP A, DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
AND A.EMP_NM LIKE '신%'
Hint 사용 유의사항
- 꼭 필요한 경우에만 사용
- 힌트를 사용하기 전에 인덱스, 통계정보, Data type의 일치 등에 문제가 없는지 먼저 확인
- 반드시 힌트대로 수행되지는 않으므로, 실행계획을 통하여 확인 필요
Hint 종류
FULL
- 인덱스를 거치지 않고 Table Full Scan을 하도록 유도
- 테이블 크기가 작거나, 처리 건수가 비교적 많아서 인덱스를 사용하는 것이 불리한 경우 사용
- 함부로 사용하는 것은 위험하며 통계정보를 생성하여 옵티마이저에게 판단을 맡겨야 한다.
- 병렬처리가 요구될 때 PARALLEL 힌트와 같이 사용
INDEX
- 특정 인덱스를 사용하도록 유도
- INDEX_ASC
- 인덱스를 Range Sacn 할 때, 인덱스 키에 대해 오름차순으로 읽는다
- INDEX 힌트와 수행되는 방법이 동일하나, 반드시 오름차순으로 읽어야 하는 경우 사용
- INDEX_DESC
- 인덱스를 Range Scan 할 때, 인덱스 키에 대해 내림차순으로 읽는다
- 내림차순으로 정렬하는 경우나, 최대값을 구할 때에 사용될 수 있다