오라클 힌트 간단 정리

서동진·2021년 1월 30일

오라클 힌트

액세스 경로, 조인 순서, 병렬및 직렬처리, Optiomizer의 목표(Goal)를 변경 가능

  • 최적화 목표
  • 엑세스 방식
  • 조인 순서
  • 조인 방식
  • 서브쿼리 팩토링
  • 쿼리 변환
  • 병렬처리
  • 기타

최적화 목표

  • ALL_ROWS
    -> 전체 처리속도 최적화
    -> ALL_ROWS는 Full Table Scan을 선호하며 CBO(Cost Based Optimization)는 default로 ALL_ROWS를 선택 합니다

  • FIRST_ROWS
    -> 최초 N건 응답속도 최적화
    -> 건에 맞는 첫 번째 row를 리턴하기 위한 Resource 소비를 최소화시키기 위한 힌트. 이며 Cost-Based 접근방식을 사용.
    -> Index Scan 이 가능하다면 Optimizer가 Full Table Scan 대신 Index Scan을 선택한다.
    -> Index Scan 이 가능하다면 Optimizer가 Sort-Merge 보다 Nested Loop을 선택한다.
    -> Order By절에 의해 Index Scan이 가능하면, Sort과정을 피하기 위해 Index Scan을 선택한다.
    -> Delete/Update Block에서는 무시된다.
    -> 다음을 포함한 Select 문에서도 제외된다.
    집합 연산자 (UNION, INTERSECT, MINUS, UNION ALL)
    Group By
    For UpDate
    Group 함수
    Distinct

    -> Full Table Scan보다는 index scan을 선호하며 Interactive Application인 경우 best response time을 제공한다
    -> sort merge join보다는 nested loop join을 선호한다.

엑세스 방식

  • FULL
    -> TABLE FULL SCAN을 유도한다.
    -> 테이블 Alias 가 있는경우는 Alias사용한다.
  • INDEX
    -> Index Scan 유도
    -> 적절한 인덱스 힌트를 사용하면 쿼리의 수행 속도를 향상시킨다
    -> ORDER BY를 사용하지 않아도 인덱스의 컬럼 순서로 정렬되어 조회된다
    -> INDEX (INDEX_ASC) : 오름차순 정렬, INDEX_DESC : 내림차순 정렬
    -> 멀티라인 주석 ( )과 싱글라인 주석( —+ ) 모두 인덱스 힌트를 사용할 수 있다
    -> 여러개의 복한 인덱스 힌트를 사용할 수 있다 (/+ INDEX(…..) INDEX(…..) / )
  • INDEX_DESC
    -> Index를 역순으로 스캔하도록 유도
  • INDEX_FFS
    -> Index Fast Full Scan 으로 유도
  • INDEX_SS
    -> Index Skip Scan 으로 유도

조인순서

  • ORDERED
    -> FROM 절에 나열된 순서대로 조인
  • LEADING
    -> LEADING 힌트 괄호에 기술한 순서대로 조인
    -> FROM절에 기술한 테이블의 순서와 상관없이 조인 순서를 제어하는 힌트로서 ORDERED 힌트와는 달리 FROM절을 변경 필요 없이 사용할 수 있다.
    -> ORDERED 힌트와 함께 사용되면 무시된다
  • SWAP_JOIN_INPUTS
    -> 해시조인시, BUILD INPUT을 명시적으로 선택

조인방식

  • USE_NL
    -> NL 조인으로 유도
  • USE_MERGE
    -> 소트머지 소트로 유도
  • USE_HASH
    -> 해시조인으로 유도
  • NL_SJ
    -> NL 세미 조인으로 유도
  • MERGE_SJ
    -> 소트 머지 세미조인으로 유도
  • HASH_SJ
    -> 해시 세미조인으로 유도

서브쿼리 팩토링

  • MATERIALIZE
    -> WITH 문으로 정의한 집합을 물리적으로 생성하도록 유도
  • INLINE
    -> WITH 문으로 정의한 집합을 물리적으로 생성하지 않고 INLINE으로 처리 하도록 유도

쿼리 변환

  • MERGE
    -> 뷰 머징 유도
  • NO_MERGE
    -> 뷰 머징 방지
  • UNNEST
    -> 서브쿼리 Unnesting 유도
  • NO_UNNEST
    -> 서브쿼리 Unnesting 방지
  • PUSH_PRED
    -> 조인조건 Pushdown 유도
  • NO_PUSH_PRED
    -> 조인조건 Push 방지
  • USE_CONCAT
    -> OR 또는 IN-List 조건을 OR-Expansion으로 유도
  • NO_EXPAND
    -> OR 또는 IN-List 조건에 대한 OR-Expansion 방지

병렬처리

  • PARALLEL
    -> 테이블 스캔 또는 DML을 병렬방식으로 처리하도록 유도
  • PARALLEL_INDEX
    -> 인덱스 스캔을 병렬 방식으로 처리하도록 유도
  • PQ_DISTRIBUTE
    -> 병렬 수행 시 데이터 분배 방식 결정

기타

  • APPEND
    -> Direct-Path Insert로 유도
  • DRIVING_SITE
    -> DB Link Remote 쿼리에 대해 최적화 및 실행 주체 지정
  • PUSH_SUBQ
    -> 서브쿼리를 가급적 빨리 필터링하도록 유도
  • NO_PUSH_SUBQ
    -> 서브쿼리를 가급적 늦게 필터링하도록 유도

출처: https://devuna.tistory.com/35 [튜나 개발일기📚]
출처: 친절한SQL튜닝

0개의 댓글