Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions Database/Hint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# SQL HINT
힌트는 SQL 튜닝의 핵심 부분으로 일종의 지시 구문이며 SQL에 포함되어 쓰여져 Optimizer의 실행계획을 원하는 대로 바꿀수 있게 해준다. 디비의 Optimizer 라고 해서 항상 최선의 실행계획을 수립할 수는 없으므로 테이블이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이 HINT 이다.

# Optimizer
옵티마이저는 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해 주는 DBMS 내부의 핵심 엔진이다. 사용자가 구조화된 질의어(SQL)로 결과 집합을 요구하면, 이를 생성하는데 필요한 처리경로는 DBMS에 내장된 옵티마이저가 자동으로 생성해준다. 옵티마이저가 생성한 SQL 처리경로를 실행계획(Execution Plan)이라고 한다. 옵티마이저는 크게 비용기반과 규칙기반으로 나누어 진다.

Comment on lines +5 to +6
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쿼리를 날릴 때마다 옵티마이저가 도르마무를 하는 건지 궁금합니다!

#### 비용기반 옵티마이저
- 옵티마이저는 데이터 딕셔너리(Data Dictionary)에 있는 오브젝트 통계, 시스템 통계 등의 정보를 사용해서 예상되는 비용을 산정한다.
- 옵티마이저는 여러 개의 실행 계획(최대 2000개) 중에서 최저 비용을 가지고 있는 계획을 선택해서 SQL을 실행한다.
(데이터베이스에서 비용이란 옵티마이저가 SQL구문을 수행하는데 소요될 최적의 시간을 추정하여 하나의 수치로 표현한것이다.)

![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBWW7E%2Fbtq9yLT3eRp%2FwdU7G58yyVHF9CQKqHR6v1%2Fimg.png)

#### 규칙기반 옵티마이저
- 규칙 기반 옵티마이저는 실행 계획을 수립할 때, 15개의 우선 순위를 기준으로 실행 계획을 수립한다.
- 실행 속도가 빠른 순으로 규칙을 먼저 세워두고 우선순위가 앞서는 방법을 채택한다.
- 최신 Oracle 버전(버전 9이상)은 규칙 기반 옵티마이저보다 비용 기반 옵티마이저를 기본적으로 사용한다.

| 우선순위 | 설명 |
| ------ | ------ |
| 1 | ROWID를 사용한 단일 행인 경우 |
| 2 | 클러스터 조인에 의한 단일 행인 경우 |
| 3 | 유일하거나 기본키(Primary key)를 가진 해시 클러스터 키에 의한 단일 행인 경우 |
| 4 | 유일하거나 기본키(Primary key)에 의한 단일 행인 경우 |
| 5 | 클러스터 조인인 경우 |
| 6 | 해시 클러스터 조인인 경우 |
| 7 | 인덱스 클러스터 키인 경우 |
| 8 | 복합 칼럼 인덱스인 경우 |
| 9 | 단일 칼럼 인덱스인 경우 |
| 10 | 인덱스가 구성된 칼럼에서 제한된 범위를 검색하는 경우 |
| 11 | 인덱스가 구성된 칼럼에서 무제한 범위를 검색하는 경우 |
| 12 | 정렬-병합(Sort-Merge) 조인인 경우 |
| 13 | 인덱스가 구성된 칼럼에서 MAX 혹은 MIN을 구하는 경우 |
| 14 | 인덱스가 구성된 칼럼에서 ORDER BY를 실행하는 경우 |
| 15 | 전체 테이블을 스캔(FULL TABLE SCAN)하는 경우 |


- ### 옵티마이저 종류

| 항목 | 규칙기반 옵티마이저 | 비용기반 옵티마이저 |
| ------ | ------ | ------ |
| 개념 | 사전에 정의된 규칙 기반 | 최소비용 계산 실행계획 수립 |
| 기준 | 실행우선 순위(Ranking) | 액세스 비용(Cost) |
| 인덱스 | 인덱스 존재 시 가장 우선시 사용 | Cost에 의한 결정 |
| 성능 | 사용자 SQL작성 숙련도 | 옵티마이저 예측 성능 |
| 장점 | 판단이 매우 규칙적 실행 예상 가능 | 통계 정보를 통한 현실 요소 적용 |
| 단점 | 예측 통계정보 요소 무시 | 최소 성능 보장 계획의 예측 제어 어려움 |
| 사례 | AND 중심 양쪽 ‘=’ 시 Index Merge 사용 | AND 중심 양쪽 ‘=’ 시 분포도별 Index 선택 |

# HINT 명령어 사용
```sh
/*+ HINT */
```
/*+ HINT */ 가 기본형태이고 'HINT' 부분만 명령어에 따라 바뀌게 된다. select 문 다음에 붙여서 사용한다.

- 예시
```sh
SELECT /*+ RULE */
EMPNO, ENAME, SAL FROM MYEMP1 e
WHERE ENAME >= '갑'
```
규칙 기반의 옵티마이저를 사용한다는 명령어이다.

# HINT의 특징
- 실행 계획을 제어한다.
- 에러가 발생하지 않는다. (힌트의 시작 /* 와 */ 은 문법에 맞게 작성되어야 한다.)
- 선택 또는 취소 될 수 있다. (힌트의 문법이 올바르더라도 힌트는 옵티마이저에 의해 버려질 수도 있고 선택되어질 수도 있다.)
- 다양한 종류의 힌트가 있으며 버전업이 될때마다 계속 추가된다.

# HINT의 종류
- 옵티마이저의 목표에 따른 힌트
- 접근 경로에 따른 힌트
- 쿼리 변환에 따른 힌트
- 조인 순서에 따른 힌트
- 조인 방법에 따른 힌트