본문 바로가기
IT 공부/SQL

[SQL튜닝] 결합인덱스

by 해모해모 2024. 3. 12.
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';
  • INDEX SKIP SCANNING : 결합인덱스의 첫 번째 컬럼이 WHERE절에서 제외되어 있고, 두번째 컬럼부터 WHERE절에 조건으로 기술되어 있는 경우에도, 그 인덱스가 사용되는 경우
    • Skip Scanning을 위한 힌트
      INDEX_SS(table명 index명)
      INDEX_SS_ASC(table명 index명)
      INDEX_SS_DESC(table명 index명)

결합인덱스 컬럼에 대한 '='의 의미

  • 범위 제한 조건
    • AREA_X1 : (시, 구, 동)
      WHERE 시 = '서울시';
      WHERE 시 = '서울시'
      AND 구 = '강남구';
      WHERE 시 = '서울시'
      AND 구 = '강남구'
      AND 동 = '역삼동';
  • 체크 조건
    • AREA_X1 : (시, 구, 동)
      WHERE 시 LIKE '서%'
      AND 구 = '강남구'  -- 체크 조건
      AND 동 = '역삼동'; -- 체크 조건
      WHERE 시 = '서울시'  -- 범위 제한 조건
      AND 구 = '강%'
      AND 동 = '역삼동'; -- 체크 조건
      WHERE 시 = '서울시'  -- 범위 제한 조건
      AND 동 = '역삼동'; -- 체크 조건
  • 인덱스 매칭률 = (WHERE절에서 첫번째 컬럼(범위제한 조건인 '=')부터 연속된 컬럼에 대해 상수(값)를 '='로 비교하는 컬럼의 개수) / (인덱스를 구성하는 컬럼의 총 개수)
    • AREA_X1 : (시, 구, 동)
      WHERE 시 = '서울시';  -- 매칭률 1/3
      WHERE 시 = '서울시'  
      AND 구 = '강남구'; -- 매칭률 2/3
      WHERE 시 = '서울시'  
      AND 구 = '강남구' 
      AND 동 = '역삼동'; -- 매칭률 3/3
  • 인덱스 매칭률 향상을 통한 속도 개선 예시
    • EMP_PAY_X1 : (급여연월, 급여코드, 사원번호)
      /* 튜닝 전 */
      WHERE 급여연월 LIKE '2016%'
      AND 급여코드 = '정기급여';
      /* 튜닝 후 */
      WHERE 급여연월 IN ('201612', '201612', '201611', '201610', '201609', '201608', '201607', '201606', '201605', '201604', '201603', '201602', '201601')
      AND 급여코드 = '정기급여';
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

댓글