본문 바로가기

dev/DB

SQL 최적화(옵티마이저, 인덱스)

SQL의 실행 절차

Parsing ▶ Execution plan 수립 ▶ SQL 실행 ▶ fetch


옵티마이저의 역할

- SQL에 대한 실행 계획(Execution plan)을 수립

- PLAN_TABLE에 실행 계획을 저장한다.


옵티마이저 분류

1. 규칙 기반 옵티마이저

- 설정된 규칙에 따라 실행

- 옵티마이저 힌트를 /*+RULE*/ 로 주면 규칙 기반 옵티마이저를 실행한다.


2. 비용 기반 옵티마이저

- 일반적으로 사용되는 옵티마이저

- 통계정보를 활용해 최적의 실행계획을 수립(총 비용이 적은 쪽으로 옵티마이징)


옵티마이저 조인

1. Nested loop 조인

- 하나의 테이블(외부 테이블)에서 데이터를 찾고 -> 다음 테이블(내부 테이블)을 조인하는 방식

- 크기가 작은 것이 외부 테이블로 사용된다. (RANDOM ACCESS양을 줄이기 위해)

- 중첩 for 문 형태이다.

- RANDOM ACCESS양을 줄이는 것이 성능향상의 핵심이다.


2. Sort merge 조인

- 조인할 두 테이블을 SORT_AREA라는 메모리 공간에 모두 로딩한다.

- 그 후 SORT 한다

- 그 후 MERGE 한다.

- 정렬 데이터 양이 많으면 성능이 급격히 저하된다.(메모리 공간이 부족해 디스크공간 사용 + SORT 비용 증가)


3. Hash 조인

- 두 테이블 중 작은 테이블을 hash 메모리에 로딩한다.(선행 테이블은 메모리에 로드될 만큼 충분히 작아야 한다.)

- 두 테이블의 조인 키를 통해 hash table을 생성한다.

- hash 연산을 위한 cpu 자원 소모가 많다.


인덱스


1. 인덱스 구조


2. 인덱스 생성

CREATE INDEX 인덱스명 ON 테이블명(인덱싱할칼럼목록)

CREATE INDEX IND_EMP

ON EMP (ENAME ASC, SAL DESC); // ENAME과 SAL에 대해 각각 오름차순, 내림차순으로 인덱스를 생성한다.

[tip] PK 칼럼은 자동으로 인덱스가 생성된다.


3. 인덱스 스캔


3.1 unique scan

- 하나의 특정한 값을 스캔할 때 발생한다. ex) EMPNO = 111 조회

- 인덱스 키 값이 중복되지 않는 경우에만 발생한다.

SELECT * FROM EMP WHERE EMPNO=111; //EMPNO는 PK로 중복되지 않으므로 유니크 스캔이 발생한다.


3.2 range scan

- 범위를 조회할 때 발생한다. (ex. LIKE, BETWEEN)

- 특정 범위의 leaf node를 스캔하는 것이다.

- 데이터 양이 적을 경우 full scan과 동일하게 작동한다.

SELECT EMPNO FROM EMP WHERE EMPNO >= 1000;


3.3. full scan

- 검색 범위가 넓을 경우 range scan이 아니라 full scan이 일어난다.

- leaf node를 모두 스캔하는 것이다.

'dev > DB' 카테고리의 다른 글

DB 함수 모음  (0) 2019.03.11
엔터티, 속성, 식별자의 분류  (0) 2019.03.11
window 함수  (0) 2019.03.10
그룹 함수  (0) 2019.03.10
SQL 표준 함수  (0) 2019.03.10