제 3장 : SQL 최적화 기본원리
제 1절 : 옵티마이저와 실행계획
- 옵티마이저 : 다양한 실행방법 중 최적의 방법을 결정
1) 분류
ㄱ) 규칙기반 옵티마이저
규칙1 : Single row by rowid → rowid으로 하나의 행을 엑세스
규칙4 : Single row by unique or PK → 유일 인텍스로 하나의 행을 엑세스
규칙8 : Composite index → 복합 칼럼 인덱스에 동등 연산자로 검색
규칙9 : Single column index → 단일 칼럼 인덱스에 동등연산자로 검색
규칙10 : Bounded range search on indexed columns → 인덱스가 형성되어 있는 칼럼에 양쪽범위를 한정하여 검색
규칙11 : Unvounded range search on indexed columns → 인덱스가 형성되어있는 칼럼에 한쪽 범위를 한정하여 검색
규칙15 : Full table scan → 전체테이블 액세스(where절 읽으면서)
- 상위 규칙일 수록 우선순위 높음
ㄴ) 비용기반 옵티마이저
- 비용(예상되는 소요시간, 자원 사용량)이 가장 적은 실행계획을 선택하는 방식
- 정확한 통계정보 유지 필수
2. 실행계획
제 2 절 : 인덱스 기본
cf) DML작업은 테이블과 인덱스를 모두 변경 → 느려질 수 있음
- 종류
1) 트리기반 인덱스(오라클)
2) 클러스터형 인덱스(SQL server)
2. TABLE 엑세스 방법
1) 전체테이블 스캔 : 테이블의 대부분인 data를 엑세스하는 것에 유리
2) 인덱스 스캔
ㄱ) 인덱스 유일스캔 : 유일 인덱스로 단일행에 엑세스
ㄴ) 인덱스 범위 스캔 :' 인덱스 다중행을 엑세스
ㄷ) 인덱스 역순 범위 스캔 : 위방법과 반대로 스캔
제 3 절 : 조인 수행 원리
- NL join
- 두개의 테이블을 중첩된 반복문처럼 조인을 수행한다.
- 반복문 외부(처음 테이블)에 있는 테이블을 선행테이블 또는 외부 테이블
- 반복문 내부(두번째 테이블)에 있는 테이블을 후행테이블 또는 내부 테이블 이라고 부른다.
1) 선행 테이블에서 조건에 맞는 값을 찾음
2) 선행 테이블의 조인 키를 가지고 후행 테이블 조인 키 확인
3) 후행 테이블의 인덱스에 선행 테이블의 조인 키 존재 확인
4) 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블 액세스
5 ~ 11) 앞의 작업을 반복 수행함
2. Sort Merge join
- Sort Merge Join은 조인 칼럼을 기준으로 데이터를 정렬하여 조인한다.
1) Sort Merge Join 특징
- 넓은 범위의 데이터를 처리할 때 주로 이용.
- 정렬 데이터가 많을 경우 성능이 떨어질 수 있다.(디스크 I/O로 인한 부하 발생)
- 비동등 조인에 대해서도 조인이 가능
- 인덱스를 사용하지 않아 인덱스가 존재하지 않을 경우에 사용할 수 있다.
1. 선행 테이블에서 조건에 맞는 행을 찾음.
2. 선행 테이블의 조인 키를 기준으로 정렬 작업 수행.
1 ~ 2번 작업을 반복 수행
3. 후행 테이블에서 조건에 맞는 행을 찾음.
4. 후행 테이블의 조인 키를 기준으로 정렬 작업 수행.
3 ~ 4번 작업을 반복 수행
5. 정렬된 결과를 이용하여 조인 수행 -> 결과값은 버퍼에 저장
3. Hash join
- NL Join의 랜던 액세스 문제점과 Sort Merge Join의 정렬 작업의 부담을 해결 위한 대안
- 칼럼 인덱스가 없을 경우 사용 가능
- 동등 조인만 수행
1. 선행 테이블에서 조건에 만족하는 행을 찾음.
2. 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블 생성
1 ~ 2번 작업을 선행 테이블의 조건 만큼 반복
3. 후행 테이블에서 조건에 만족하는 행을 찾음
4. 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾음
5. 조인에 성공하면 추출버퍼에 저장
3 ~ 5번 작업을 후행 테이블의 조건 만큼 수행