SQL튜닝 - 실행계획 제어

alsoj·2023년 9월 15일

SQL튜닝

목록 보기
3/7

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

-- 예시 1
SELECT /*+ index(EMP IDX01) +/
	EMP_NO, EMP_NM ...
FROM EMP
WHERE EMP_NM LIKE '신%'

-- 예시 2
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 할 때, 인덱스 키에 대해 내림차순으로 읽는다
    • 내림차순으로 정렬하는 경우나, 최대값을 구할 때에 사용될 수 있다

0개의 댓글