• Home
  • About
    • 코드좀비 photo

      코드좀비

      An amazing website.

    • Learn More
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

SQLD 핵심 정리 sql 최적화 기본 원리

02 Jun 2019

Reading time ~2 minutes

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…

저번에 기껏 작성해놓고 저장을 까먹는바람에;; 업로드가 하루 비었고 날라가버렸다 ㅠㅠ.. 그래서 다시 작성..



sqldsql활용 Share Tweet +1