[SQL-TUNING] 테이블 엑세스 최소화 (3)

­이승환·2022년 3월 31일
0

Sql-tuning

목록 보기
5/8

인덱스 설계


  • 데이터베이스 트랜잭션에 큰 영향을 끼치는 인덱스의 중요성은 아무리 강조해도 지나치지 않다.
  • 많은 경험과 고도의 기술력이 요구되는 영역이다.
  • 세밀한 인덱스의 원리에 대한 이해와 더불어 많은 경험이 필요로 되는 분야이다.
  • 이번 포스트에서는 전략적 설계의 필요성과 방법론에 대해서 간단하게 요약해보고자 한다.

인덱스 설계가 어려운 이유

  • 인덱스를 아무렇게나 작성하면 아래와 같은 문제를 만나게 된다.

    1. DML 성능 저하
    2. 데이터베이스 사이즈 증가
    3. 데이터베이스 관리 및 운영 비용 상승
    4. 인덱스 분할
    5. DELETE 명령 실행시, 인덱스에서 레코드를 일일이 찾아 지워줘야 한다.
  • 인덱스 분할이란, 인덱스는 정렬이 되어서 저장되는데 만약 블록에 더이상 저장공간이 없을때 실행하는 것이다. 예를 들어, 정렬 순서상 5번 리프 블록에 값을 입력해야 하는데, 그 블록이 꽉 차 있으면 새로운 블록을 5번과 6번 사이에 끼워넣고, 그 뒤에 리프노드들을 6번 블록으로 옮기는 것을 말한다.

가장 중요한 2가지 설정 기준

  • 앞선 포스팅에서 데이터베이스 성능을 최대화 하기 위해선, 수직접근비용 + 수평접근비용 + 랜덤 I/O 를 최소화 하는 것이라 언급하였다.
  • 인덱스의 경우 Index Range Scan이 기본인 만큼, 인덱스 컬럼의 순서를 잘 배치하는 것이 가장 중요하다.
    1. 조건절에 항상 사용하거나, 자주 사용하는 컬럼을 인덱스로 설정한다.
    2. '=' 조건을 자주 사용할 수록 선행 컬럼으로 설정한다.

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

  • 그 외 고려할 사항은 아래와 같다.
    1. 수행 빈도
    2. 업무상 중요도
    3. 클러스터링 팩터
    4. 데이터량
    5. DML 부하
    6. 저장공간
    7. 인덱스 관리 비용

공식을 초월한 전략적 설계

  • 조건절 패턴이 여러개 있다고 해서, 성능을 위해 인덱스를 무작정 추가할 수는 없다.
  • 튜닝 전문가들은 실제로, 최적을 달성해야 할 가장 핵심적인 액세스 경로 한두 개를 전략적으로 선택하고, 나머지 경로는 약간의 비효율이 있더라도 목표 성능을 만족하는 수준으로 인덱스를 구성할 수 있어야 한다.

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

  • order by, group by 에 해당하는 칼럼을 추가하는 것도 고려의 대상이다.
    1. = 연산자를 사용한 조건절 컬럼 선정
    2. order by 절에 기술한 컬럼 추가
    3. = 연산자가 아닌 조건절 컬럼은 데이터 분포를 고려해서 추가한다. 즉 랜덤 i/o에 영향을 끼치는지 실행계획을 보고 고려해본다.

결합 인덱스 선택 및 중복 인덱스 제거

  • 중복되는 인덱스들의 조합을 최소화 하는 것이 중요하다.
  • 컬럼이 다르다해서 중복이 아니라고 생각하는 경우가 있는데, 만일 선행 컬럼이 카디널리티가 낮다면, 중복이 될 수 있다는 것을 명심해라.
  • 차라리 인덱스들을 합치는게 나은 경우도 존재한다.

인덱스 설계도 작성

  • 인덱스 설계도를 엑셀과 같은 프로그램을 이용해 정리하여 문서로 남기는 것도 하나의 방법이다.
  • 튜닝이 될 때마다, 인덱스들을 문서로 남겨서 변화를 관찰하는 것도 좋다.
profile
Mechanical & Computer Science

0개의 댓글