오라클 힌트
액세스 경로, 조인 순서, 병렬및 직렬처리, 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튜닝