Msg 성장일기
인덱스 설계 본문
SQL 각각에 최적화된 인덱스를 마음껏 생성할 수 있다면, SQL 튜닝과 인덱스 설계만큼 쉬운 일도 없을 것이다.
하지만 인덱스가 너무 많으면 아래와 같은 문제가 발생한다.
1. DML 성능 저하 (→ TPS 저하)
2. 데이터베이스 사이즈 증가(→ 디스크 공간 낭비)
3. 데이터베이스 관리 및 운영 비용 상승
결합 인덱스 구성 시 중요한 기준
1. 조건절에 항상 사용하거나 자주 사용하는 컬럼을 선정한다.
2. '=' 조건으로 자주 조회하는 컬럼을 앞쪽에 둔다.
→ 위 2가지의 판단 기준은 인덱스 스캔 효율성이다.
그 외 고려해야할 판단 기준은 다음과 같다.
→ 수행빈도, 업무상 중요도, 클러스터링 팩터, 데이터량, 저장공간, DML 부하 등
수행빈도가 매우 높은 SQL이라면, 테스트 과정에 당장 성능이 좋게 나오더라도 인덱스를 최적으로 구성해 줘야한다. NL 조인 Inner 쪽 인덱스는 '=' 조건 컬럼을 선두에 두는 것이 중요하고, 될 수 있으면 테이블 액세스 없이 인덱스에서 필터링을 마치도록 구성해야 한다.
[ 소트 연산을 생략하기 위한 컬럼 추가 ]
인덱스는 항상 정렬 상태를 유지하므로 ORDER BY, GROUP BY를 위한 소트 연산을 생략할 수 있게 해준다. 따라서 조건절에 사용하지 않는 컬럼이더라도 소트 연산을 생략할 목적으로 인덱스 구성에 포함시킴으로써 성능 개선을 도모할 수 있다.
I/O를 최소화하면서 소트 연산을 생략하면, 아래 공식에 따라 인덱스를 구성하면 된다.
1) '=' 연산자로 사용한 조건절 컬럼 선정
2) ORDER BY 절에 기술한 컬럼 추가
3) '=' 연산자가 아닌 조건절 컬럼은 데이터 분포를 고려해 추가 여부 결정
출처: 개발자를 위한 SQL 튜닝 입문서 친절한 SQL 튜닝
'study_SQL > 친절한 SQL 튜닝' 카테고리의 다른 글
| 소트 튜닝 (0) | 2023.06.16 |
|---|---|
| 조인튜닝 (0) | 2023.06.15 |
| 인덱스 스캔 효율화 (0) | 2023.06.14 |
| 부분범위 처리 활용 (0) | 2023.06.14 |
| 테이블 액세스 최소화 (0) | 2023.06.14 |