인덱스 설계

이재철·2021년 9월 26일
1

SQL

목록 보기
7/11

인덱스 설계가 어려운 이유

  • DML 성능 저하(-> TPS 저하)
  • 데이터베이스 사이즈 증가 (-> 디스크 공간 낭비)
  • 데이터베이스 관리 및 운영 비용 상승

가장 중요한 두 가지 선택 기준

  • 조건절에 항상 사용하거나, 자주 사용하는 컬럼을 선정
  • '=' 조건으로 자주 조회하는 컬럼을 앞쪽에 둔다.

스캔 효울성 이외의 판단 기준

  • 수행 빈도(가장 중요한 하나)
  • 업무상 중요도
  • 클러스터링 팩터
  • 데이터 량(인덱스 설계할 때 중요한 판단 기준)
  • DML 부하(기존 인덱스 개수, 초당 DML 발생량, 자주 갱신하는 컬럼 포함 여부 등)
  • 저장 공간
  • 인덱스 관리 비용 등

공식을 초월한 전략적 설계

  • 열개 중 최적을 달성해야할 가장 핵심적인 액세스 경로 한두 개를 전략적으로 선택해서 최적의 인덱스를 설계하고
  • 나머지 액세스 경로는 약간의 비효율이 있더라도 목표 성능을 만족하는 수준으로 인덱스를 구성할 수 있어야 함.
  • 왜 그런 선택을 했는지, 전략적 판단 근거가 무엇인지 말할 수 있어야 함.
  • 업무 상황을 이해하고 나름의 판단 기준을 가지고 결정을 내리는 것!
  • 인덱스 개수를 최소화하면, 사용빈도가 높거나 중요한 액세스 경로가 새로 도출됐을 때 최적의 인덱스를 추가할 여유도 생김

소트 연산을 생략하기 위한 컬럼 추가

  • 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인덱스 구성에 포함시킴으로써 성능 개선을 도모할 수 있다.
  • 조건을 만족하는 데이터를 빨리 만날 수 있느냐가 관건임.

    I/O를 최소화하면서 소트 연산 생략 공식

    1. '=' 연산자로 사용한 조건 컬럼 선정
    2. ORDER BY 절에 기술한 컬럼 추가
    3. '=' 연산자가 아닌 조건절 컬럼은 데이터 분포를 고려해 추가 여부 결정
  • IN 조건은 '='이 아니다.
    • 소트 연산을 생략하려면 IN 조건절이 IN-List Iterator 방식으로 풀려선 안됨.
    • 즉, IN 조건절을 인덱스 액세스 조건으로 사용하면 안됨. 필터조건으로 사용

결합 인덱스 선택도

  • 인덱스 생성 여부를 결정할 때는 선택도가 충분히 낮은지가 중요한 판단 기준
  • 선택도란?
    • 전체 레코드 중에서 조건절에 의해 선택되는 비율
  • 선택도에 총 레코드 수를 곱해서 카디널리티를 구함
  • 선택도가 높은(카디널리티가 높은) 인덱스는 생성해봐야 효용가치가 별로 없다.

    인덱스 생성 여부를 결정할 때는 선택도가 매우 중요하지만,
    컬럼 간 순서를 결정할 때는 각 컬럼의 선택도보다 필수 조건 여부, 연산자 형태가 더 중요한 판단 기준이다.
    어느 컬럼을 앞에 두는 것이 유리한지는 상황에 따라 판단할 일

중복 인덱스 제거

인덱스 설계도 작성

0개의 댓글