sqld 최적화 기본 원리 파트입니다.
옵티마이저
- 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하는 역할 수행
규칙기반 옵티마이저
- 우선순위를 가지고 실행계획 생성. 인덱스 최우선
비용기반 옵티마이저
- 현재 대부분의 DB에서 사용. SQL을 처리하는데 필요한 비용이 최소가 되도록 실행계획 선택. 통계정보를 이용한다.
실행계획
- SQL에서 요구한 사항을 처리하기 위한 절차와 방법을 의미한다.
- 구성요소로는 조인 순서, 조인 기법, 액세스 기법, 최적화 정보, 연산 등이 있다.
인덱스
- 원하는 데이터를 쉽게 찾을 수 있도록 돕는다. 검색 성능의 최적화를 목적이나, 수정, 삽입,삭제 시 오히려 느려질 수 있다. ( 수정시 인덱스 칼럼 건드리는거 아니면 안느려진다!)
B-TREE 인덱스
-
B 는 바이너리가 아니라 밸런스드 트리 인덱스.
-
노드 아래에 왼쪽, 중간, 오른쪽 3개의 노드가 있음. 왼쪽에는 왼쪽보다 작은거, 오른쪽에는 오른쪽보다 큰거. 그 사이는 가운대 가면 됨
전체 테이블 스캔
-
모든 데이터 읽어 가며 스캔.
-
sql문에 조건이 존재하지 않거나, 인덱스가 없을떄, 병렬처리 방식으로 처리하는 경우 등
인덱스 스캔
- 인덱스를 구성하는 칼럼의 값을 기반으로 데이터를 추출하는 엑세스 기법
인덱스 유일 스캔
- 유일 인덱스를 사용하여 단 하나의 데이터를 추출하는 방식
인덱스 범위 스캔
- 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식
인덱스 역순 범위 스캔
- 인덱스의 리프 블록의 양방향 링크를 이용해 내림차순으로 데이터를 읽는다.
NL Join
- 프로그래밍에서 사용하는 중첩 반복문처럼 조인을 수행. 랜덤 엑세스 방식으로 데이터를 읽음.
Sort Merge Join
- 조인 칼럼을 기준으로 데이터를 정렬하여 조인 수행. 스캔 방식으로 데이터를 읽는다.
Hash join : CPU 작업 위주로 처리. 해쉬 기법 이용. NL Join의 랜덤 엑세스 문제와, SMJ의 정렬 작업 부담 해결
NL JOIN 코딩처럼 설명!. 편하게 이해하자
int a[30];
int b[30];
int c[30];
int cIndex =0 ;
/* a, b input */
for(int i =0 ; i < a.size(); i++){
for (int j = 0 ; j < b.size(); j++){
if( a[i] == b[j] ){
c[cIndex] = a[j];
cIndex++;
}
}
}
정말 쉽다.. 나온 설명들은 다 너무 어렵지만 이렇게 코드적으로 생각하면 편하다.
Sort-Merge Join 코딩처럼
int a[30];
int b[30];
int c[30];
int aIndex =0;
int bIndex =0 ;
int cIndex =0 ;
int mark = 0 ;
/* a, b input */
/* sort a, b */
while(aIndex != a.size() && bIndex!=b.size()){
if(mark == 0 ){
while(a[aindex] < b[bIndex]) // 추가로 인덱스가 끝에 달하면 종료
aIndex++;
while(a[aIndex] > b[bIndex]) // 추가로 인덱스가 끝에 달하면 종료. 들어가야하지만 간략하게 이해만
bIndex++;
mark = 1;
}
if(a[aIndex] == b[bIndex]){
c[cIndex] = a[aIndex];
cIndex++;
bIndex++;
}
else{
bIndex = 0; // 동일한게 여러개 있을 수 있으니까
aIndex ++;
mark = 1;
}
이 방법은 조금 다르기는 하나 머지 소팅과 기본적으로 동일한 방법이다. 해시 조인은 뭐.. 말 그대로 해시 조인이라 딱히 추가로 설명이 필요없다고 생각하여 넘어간다. 모르겠으면 맵 관련해서 찾아보면 간단하다.
ps…
저번에 기껏 작성해놓고 저장을 까먹는바람에;; 업로드가 하루 비었고 날라가버렸다 ㅠㅠ.. 그래서 다시 작성..