DB/SQL튜닝

업무에 바로 쓰는 SQL튜닝 입문 - 4교시(결합인덱스)

Kang_hobin 2022. 9. 25. 22:26
일단 인덱스 컬럼 선정하기 위해서는 최소 2가지는 기억하자!
1. 조건절에 자주 등장하는 컬럼!
2. 조인 조건에 자주 사용되는 컬럼!!

 

시작전 문제
1. 결합인덱스를 사용하기 위해선 인덱스를 구성하는 모든 컬럼이 WHERE 절에 기술되어야 한다.
X : 결합인덱스의 첫 번째 컬럼을 제외한 나머지 컬럼들은 기술되지 않아도 된다.
2. 결합인덱스를 구성하는 컬럼의 순서대로 WHERE절에 컬럼에 대한 조건을 기술해야 한다.
X : WHERE절에 기술하는 조건의 순서는 결합인덱스 칼럼의 순서와 상관없다.
결합인덱스

결합인덱스 컬럼을 선택할 때 고려사항
1. WHERE 절에서 AND 조건으로 자주 결합되어 사용되면서 각각의 분포도 보다 두 개 이상의 컬럼이 결함될 때 분포도가 좋아지는 컬럼들
2. 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들
3. 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때, 이러한 컬럼을 모두 포함

결론적으로 조건에 묶여서 자주 쓰이는 컬럼은 묶어서 결합인덱스로 써라 이거임!

결합인덱스의 컬럼 순서 결정(우선순위)
1. WHERE 절 조건에 많이 사용되는 컬럼 우선
2. Equal로 사용되는 컬럼 우선
3. 분포도가 좋은 컬럼 우선
- 조건에 부합하는 데이터의 범위가 좁은 것!
4. 자주 이용되는 Sort의 순서로 결정!
- 고정된 Sort의 순서를 가진 SQL문이 자주 사용되는 경우에는 3,4의 비중이 바뀔 수 있음.

 

결합 인덱스 사용 가능한 예
1. WHERE 급여년월 = '201610';

2. WHERE 급여년월 = '201610'
     AND 급여코드 = '정기급여';
     
3. WHERE 급여년월 = '201610'
     AND 급여코드 = '정기급여'
     AND 사원번호 = '1234';

위와 같이 급여년월이 항상 고정되어 있는 경우! 결합인덱스로 사용할 수 있는 것이다!!

 

단, CBO에서 첫번째 컬럼(위에서는 급여년월)이 누락된 경우에도 인덱스가 사용될 경우!

= Skip Scanning임

강제로 제어해야 하는데, 그 수단은 다음과 같음(Hint)

Skip Scanning Hint
1. INDEX_SS
2. INDEX_SS_ASC
3. INDEX_SS_DESC

 

결합인덱스 컬럼의 '='의 의미

1의 경우 WHERE 시 LIKE '서%'를 넣음으로서 나머지 AND 조건이 모두 체크 조건(범위제한조건이 아닌)으로만 사용되게 되버렸다.
2의 경우 '구'가 LIKE가 되버리면서 '동' 또한 범위가 아닌 체크조건이 되버렸다. 모든 구를 찾아야만 동을 찾게 되버린것이다.
3 처럼 아예 제외된 경우도 마찬가지다.

 

따라서 결합인덱스는 인덱스매칭률(전체 인덱스 수와 사용되는 '='의 개수의 퍼센트!)에 영향이 크다는 것이다!

따라서 인덱스가 (급여년월, 급여코드, 사원번호) 인 경우에 다음의 쿼리는 수정이 속도개선에 도움이 될 수 있다.

WHERE 급여년월 LIKE '2016%'
  AND 급여코드 = '정기급여';
  
-- LIKE 때문에 인덱스 매칭률('='를 사용하는 개수)가 떨어져 버린다.
-- 따라서 아래와 같이 수정하는게 성능 개선에 도움이 된다.

WHERE 급여년월 IN ('201612', '201611' ..... '201601')
  AND 급여코드 = '정기급여';
LIKE는 되도록 안 쓰는게 나은가 보다. 차라리 Equal의 의미인 IN 으로 사용하는 것이 낫다는 것!