SQL

SQL Oracle - 튜닝 Hint 힌트

yangcotton 2023. 1. 6. 19:32

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