Oracle Hint (오라클 힌트)란
SQL 튜닝의 일종인 지시문구이다.
오라클 옵티마이저(Optimizer")가 SQL문을 실행 계획을 바꿔 데이터 스캔 경로, 조인방법을 알려주는 것이다.
사용자가 특정 SQL 문장에서 어떤 인덱스가 선택도가 더 높은지 잘 알고있는 경우, 힌트, 인덱스, 조인의 개념을 정확히 알고 사용한다면 직접 최적의 실행 경로를 작성하는 것 이기 때문에 옵티마이저에게 의존한 실행계획보다 효율적이다.
하지만 잘못사용한다면 더 느려지는등 좋지않음.. 당연..
힌트는 액세스 경로, 조인순서, 병렬 및 직렬 처리, Optimizer의 목표 변경이 가능하다.
사용방법은
SELECT /*+ (힌트명)*/
A1
, A2
, A3
FROM TABLE
이렇게 SELECT 뒤에 써주고
여러개의 힌트는 공백으로 줄 수 있다.
/*+ (힌트명1) (힌트명2)*/
힌트에 오타가 난다면 무시되어 없는것처럼 동작한다.
1. 최적화 목표
- /*+ALL_ROWS */: 전체 처리속도 최적화 , Cost-Based 접근방식 , Full Table Scan을 선호하며 CBO(COST Based Optimiztion)는 default로 ALL_ROWS를 선택
-/*+FIRST_ROWS(N) */ : 최초 N건 응답속도 최적화, 조건에 맞는 첫 번째 row를 리턴하기 위한 Resource 소비를 최소화시키기 위한 힌트 , Cost-Based 접근방식
2.액세스 방식
- /*+FULL */ :인덱스 타지않고 지정된 테이블 풀스캔으로 접근
- /*+INDEX(table_name index_name) */: 지정된 index를 강제적으로 쓰게끔 지정
- /*+INDEX_DESC */: 인덱스를 ORDER BY DESC 역순으로 (시간, 결과값등 최근인것 혹은 MAX값 구할때 좋음)
- /*+INDEX_ASC */: 내림차순
- /*+INDEX_FFS */: Full table scan보다 빠른 Full index scan을 유도
- /*+INDEX_SS */: INDEX SKIP SCAN
3. 조인순서
- /*+ORDERED */: FROM절에 나열된 테이블 순서대로 조인
- /*+LEADING */: 파라미터에 명시된 테이블의 순서대로 조인 EX: /*+ LEADING (A B C)*/
-- A,B,C 순서대로 조인하세요
- /*+DRIING(table_name)*/ : 해당 테이브을 먼저 DRIVING
4. 조인방식
- /*+USE_NL */ :NL(NESTED LOOP - 중첩루프)방식 조인 유도, 흔히 ORDERED Hint와 함께 쓴다.
- /*+USE_MERGE */: 지정된 테이블들 소트머지 조인으로 유도
- /*+USE_HASH */: 각 테이블간 해시조인으로 유도
-/*+NL_SJ */: NL SEMI조인으로 유도
-/*+MERGE_SJ */: 소트머지 세미조인으로 유도
-/*+HASH_SJ */: 해시 세미조인으로 유도
5. 서브쿼리팩토링
- /*+MATERIALIZE */: WITH문으로 정의한 집합을 물리적으로 생성하도록 유도
EX) WITH /*+ MATERIALIZE*/ T AS (SELECT ...)
- /*+INLINE */: WITH문으로 정의한 집합을 물리적으로 생성하지않고 INLINE 처리하도록 유도
EX)WITH /*+ INLINE*/ T AS (SELECT ...)
6.쿼리변환
- /*+ MEERGE */: 뷰 머징 유도 COMPLEX_VIEW_MERGING = FALSE로 되어 있을 때 view 또는 subquery의 내용을 merge가능
- /*+NO_MERGE */: 뷰 머징 방지
- /*+UNNEST */: 서브쿼리 UNNESTING 유도
- /*+NO_UNNEST */: 서브쿼리 UNNESTING 방지
7.병렬처리
- /*+PARALLEL */: 테이블 스캔, DML 병렬방식으로 처리하도록 할때 사용.. 단일 대형 테이블의 접근시 정말 많이 쓴다.
EX) /*+ PARALLEL(T1 4)*/
- /*+PARALLEL_INDEX */: 인덱스 스캔을 병렬방식으로 처리하도록 유도
PARALLEL_INDEX(Table_name, index_name, parallel 개수)
8. 그외 기타
- /*+APPEND*/: INSERT 할때 DIRECT PATH INSERT유도
- /*+DRIVING_SITE */: DB LINK REMOTE쿼리에 대한 최적화 및 실행 주체 지정 (LOCAL 또는 REMOTE)
- /*+PUSH_SUBQ */: 서브쿼리를 먼저 수행
- /*+NO_PUSH_SUBQ */: 서브쿼리를 가급적 늦게 필터링 하도록 유도
'SQL' 카테고리의 다른 글
[SQL] NVL , NVL2 (0) | 2023.02.10 |
---|---|
[SQL Oracle] ROWNUM =2 사용법 , 쿼리문 실행순서 (0) | 2023.01.05 |
SQL SELECT 조건절 / WHERE 조건절 / JOIN (0) | 2022.11.29 |