1. 인덱스 머지(Index Merge) vs 결합인덱스(Composite Index)
인덱스 머지는 각각 단 하나의 칼럼으로 구성된 인덱스들을 동시에 사용하는 방법.(개별 칼럼에 인덱스가 생성되어 있으면서 모두 where 절에 '=' 조건으로 사용되며, 각각의 인덱스 조합으로 자료에 접근하는 것을 의미함.)
결합인덱스는 2개 이상의 칼럼으로 구성된 인덱스를 의미함.
결합인덱스가 보다 간결한 프로세스, 좋은 엑세스 경로를 제공함.
2. 결합인덱스의 구성
1) 결합인덱스 칼럼 선택
① WHERE 절에서 AND 조건으로 자주 결합되어 사용되면서 각각의 분포도 보다 두 개의 칼럼이 결합될 때 분포도가 좋아지는 칼럼들
(분포도란 '칼럼에 속한 데이터의 종류가 많다' 라는 의미. 분포도 = 1 / 칼럼의 DISTINCT 데이터 수 * 100)
② 다른 테이블과 조인의 연결고리로 자주 사용되는 칼럼들
③ 하나 이상의 키 칼럼 조건으로 같은 테이블의 칼럼들이 자주 조회될 때, 이러한 칼럼을 모두 포함(결합)
2) 결합인덱스의 칼럼 순서 결정
① WHERE 절 조건에 많이 사용되는 칼럼 우선
② Equal('=')로 사용되는 칼럼 우선
③ 분포도가 좋은 칼럼 우선
④ 자주 이용되는 Sort의 수서로 결정
* 고정된 Sort의 순서를 가진 SQL문이 자주 사용되는 경우에는 2-3), 2-4)의 비중이 바뀔 수 있음.
3. 결합인덱스 사용 방법
결합인덱스의 첫 번째 칼럼이 where 절에서 제외되어 있는 경우, 결합인덱스를 사용할 수 없음.
* Skip Scanning : 결합인덱스의 첫 번째 칼럼이 WHERE절에서 제외되어 있고, 두 번째 칼럼부터 WHERE절에 조건으로 기술되어 있는 경우에도, 그 인덱스가 사용되는 경우를 의미한다.
* Skip Scannig을 쓰려면 아래와 같이 Hint를 주면 된다
INDEX_SS (테이블명 INDEX명)
INDEX_SS_ASC (테이블명 INDEX명)
INDEX_SS_DESC (테이블명 INDEX명)
4. 결합인덱스 칼럼에 대한 '='의 의미
체크조건이 될 수도, 범위 제한 조건이 될 수도 있다.
(인덱스 순서대로 바로 사용된다면, 범위제한조건이 되고 아니면 체크 조건이 되어 버린다.)
예시) AREA_X1 : (시, 구, 동) 이라는 index가 존재
WHERE 시 LIKE '서%'
AND 구 = '강남구' ← 체크조건
AND 동 = '역삼동' ← 체크조건
WHERE 시 = '서울시' ← 범위제한조건
AND 구 LIKE '강%'
AND 동 = '역삼동' ← 체크조건
WHERE 시 = '서울시' ← 범위제한조건
AND 동 = '역삼동' ← 체크조건
* 인덱스 매칭률 =
WHERE절에서 첫번째 칼럼부터 연속된 칼럼에 대해 상수(값)를 '='로 비교하는 칼럼의 개수 / 인덱스를 구성하는 칼럼의 총 개수 (범위제한 조건인 '=')
예시) AREA_X1 : (시, 구, 동) 이라는 index가 존재
WHERE 시 = '서울시' (매칭률 = 1/3)
WHERE 시 = '서울시'
AND 구 = '강남구' (매칭률 = 2/3)
WHERE 시 = '서울시'
AND 구 = '강남구'
AND 동 = '역삼동' (매칭률 = 3/3)
* 인덱스 매칭률 향상을 통한 속도 개선방법 예시
EMP_PAY_X1 : (급여연월, 급여코드, 사원번호) 라는 index가 존재
WHERE 급여연월 LIKE '2016%'
AND 급여코드 = '정기급여' ;
-> 아래와 같이 튜닝이 가능함,
WHERE 급여연월 IN ('201612', '201611', '201610', ..... , '201601')
AND 급여코드 = '정기급여'
;
'IT > SQL' 카테고리의 다른 글
| Nested Loop Join (0) | 2023.07.24 |
|---|---|
| 인덱스 활용이 불가능한 경우 (0) | 2023.07.23 |
| 인덱스(Index) (0) | 2023.07.15 |
| 옵티마이저(Optimizer) (0) | 2023.07.14 |
| SQL 실행계획 (0) | 2023.07.08 |








