728x90
반응형
[SQL튜닝] 결합인덱스
주요내용
- 인덱스 머지 VS 결합인덱스
- 결합인덱스의 구성
- 결합인덱스 사용 방법
- 결합인덱스 컬럼에 대한 '='의 의미
학습목표
- 결합인덱스에 대한 이해를 바탕으로 비효율적으로 수행되는 SQL 문장을 진단할 수 있다.
- 결합인덱스를 활용하여 SQL 문장을 성능목표에 부합하도록 개선할 수 있다.
- 결합인덱스 활용을 통해 개선된 SQL 문장이 성능목표에 부합하는지 테스트할 수 있다.
인덱스 머지 VS 결합인덱스
- 인덱스 머지 : 단 하나의 컬럼으로 구성된 인덱스가 하나의 테이블에 두 개 이상 있었을 때 그 인덱스를 동시에 사용해 돌아가는 현상을 가리킨다.(비효율적)
- 결합인덱스 : 두 컬럼을 모두 결합해서 하나의 인덱스를 구성하기 때문에 프로세스가 간결하다. 인덱스 머지에 따른 비효율성을 해소한다.
결합인덱스의 구성
- 결합인덱스 컬럼 선택
- WHERE 절에서 AND 조건으로 자주 결합되어 사용되면서 각각의 분포도보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼들
- 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들
- 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때, 이러한 컬럼을 모두 포함(결합)
- 결합인덱스의 컬럼 순서 결정
- WHERE절 조건에 많이 사용되는 컬럼 우선
- Equal('=')로 사용되는 컬럼 우선
- 분포도가 좋은 컬럼 우선
- 자주 이용되는 Sort의 순서로 결정
=> 고정된 Sort의 순서를 가진 SQL문이 자주 사용되는 경우에는 분포도가 좋은 컬럼보다 자주 이용되는 Sort의 순서로 결정될 수 있다.
결합인덱스 사용 방법
- 결합인덱스 사용 가능한 예
- EMP_PAY_X1 : (급여연월, 급여코드, 사원번호)
WHERE 급여연월 = '201610';
WHERE 급여연월 = '201610' AND 급여코드 = '정기급여';
WHERE 급여연월 = '201610' AND 급여코드 = '정기급여' AND 사원번호 = '33139649';
- EMP_PAY_X1 : (급여연월, 급여코드, 사원번호)
- INDEX SKIP SCANNING : 결합인덱스의 첫 번째 컬럼이 WHERE절에서 제외되어 있고, 두번째 컬럼부터 WHERE절에 조건으로 기술되어 있는 경우에도, 그 인덱스가 사용되는 경우
- Skip Scanning을 위한 힌트
INDEX_SS(table명 index명)
INDEX_SS_ASC(table명 index명)
INDEX_SS_DESC(table명 index명)
- Skip Scanning을 위한 힌트
결합인덱스 컬럼에 대한 '='의 의미
- 범위 제한 조건
- AREA_X1 : (시, 구, 동)
WHERE 시 = '서울시';
WHERE 시 = '서울시' AND 구 = '강남구';
WHERE 시 = '서울시' AND 구 = '강남구' AND 동 = '역삼동';
- AREA_X1 : (시, 구, 동)
- 체크 조건
- AREA_X1 : (시, 구, 동)
WHERE 시 LIKE '서%' AND 구 = '강남구' -- 체크 조건 AND 동 = '역삼동'; -- 체크 조건
WHERE 시 = '서울시' -- 범위 제한 조건 AND 구 = '강%' AND 동 = '역삼동'; -- 체크 조건
WHERE 시 = '서울시' -- 범위 제한 조건 AND 동 = '역삼동'; -- 체크 조건
- AREA_X1 : (시, 구, 동)
- 인덱스 매칭률 = (WHERE절에서 첫번째 컬럼(범위제한 조건인 '=')부터 연속된 컬럼에 대해 상수(값)를 '='로 비교하는 컬럼의 개수) / (인덱스를 구성하는 컬럼의 총 개수)
- AREA_X1 : (시, 구, 동)
WHERE 시 = '서울시'; -- 매칭률 1/3
WHERE 시 = '서울시' AND 구 = '강남구'; -- 매칭률 2/3
WHERE 시 = '서울시' AND 구 = '강남구' AND 동 = '역삼동'; -- 매칭률 3/3
- AREA_X1 : (시, 구, 동)
- 인덱스 매칭률 향상을 통한 속도 개선 예시
- EMP_PAY_X1 : (급여연월, 급여코드, 사원번호)
/* 튜닝 전 */ WHERE 급여연월 LIKE '2016%' AND 급여코드 = '정기급여';
/* 튜닝 후 */ WHERE 급여연월 IN ('201612', '201612', '201611', '201610', '201609', '201608', '201607', '201606', '201605', '201604', '201603', '201602', '201601') AND 급여코드 = '정기급여';
- EMP_PAY_X1 : (급여연월, 급여코드, 사원번호)
728x90
반응형
'IT 공부 > SQL' 카테고리의 다른 글
[SQL튜닝] NESTED LOOPS JOIN (0) | 2024.03.19 |
---|---|
[SQL튜닝] 인덱스 활용이 불가능한 경우 (2) | 2024.03.13 |
[SQL튜닝] 인덱스 (3) | 2024.03.11 |
[SQL튜닝] 옵티마이저 (4) | 2024.03.07 |
[SQL튜닝] 실행계획 (0) | 2024.03.06 |
댓글