개발/TIL

[sql 튜닝] 3.3 인덱스 스캔 효율화

ebang 2025. 4. 18. 22:00
  • 기본적으로는 인덱스 칼럼 추가로 튜닝을 하는데, (랜덤 IO 줄이는 효과인가? ) 인덱스 스캔 효율화는 다양한 방법이 존재한다.

3.3.1. 인덱스 탐색

  • 인덱스 탐색 과정 상세
    • 인덱스를 구성하는 두 개 칼럼에 대해, 둘다 between 조건 절로 묶여있다면 선두 칼럼은 인덱스의 스캔 범위를 줄이는데 도움이 되지만, 두번째 칼럼은 그렇지 못하다.

3.3.2. 인덱스 스캔 효율성

  • 결국 인덱스 선행 컬럼이 조건절에 없거나, '=' 연산이 아니라면 비효율이 발생한다.

    • C1, C2, C3, C4 -> C3 에 대한 조건 없이 C4 에 대한 '=' 조건만 있는 경우, 비효율 발생.
    • '=' 가 아니라 between 조건이라면 비효율 발생.
  • 선두 칼럼

    • 가장 앞에 있는 칼럼.
  • 선행 칼럼

    • 특정칼럼보다 상대적으로 앞쪽에 있는 칼럼

3.3.3. 엑세스 조건과 필터 조건

  • 인덱스 스캔 단계에 처리하는 조건절
    • 엑세스 조건
      • 인덱스 스캔 범위를 정하는 조건절. (인덱스 수직적 탐색을 통해 스캔 시작점 / 리프 블록 탐색을 수행하다가 멈출 위치에 영향. )
    • 필터 조건
      • 인덱스 필터
        • 테이블로 엑세스 할지를 결정하는 조건절.
        • 인덱스로 접근하든, 테이블 full scan 을 하든 테이블에 엑세스하는 것은 필터조건이다.
      • 테이블 필터
        • 엑세스 단계에서 처리되는 조건절 모두.
        • 다음으로 갈지, 최종 결과에 넣을지

3.3.4. 비교 연산자 종류와 칼럼 순서에 따른 군집성
3.3.5. 인덱스 선행 칼럼이 등치 조건이 아닐 때 생기는 비효율
3.3.6. BETWEEN 을 IN-LIST 로 전환

  • In-LIST 항목 개수가 늘어날 경우
    • NL 방식의 조인 or 서브쿼리
  • 주의사항
    • 리프 블록의 탐색보다 수직적 탐색이 더 많아지는 경우를 주의.
    • -> 레코드들이 서로 멀리 떨어져있을 때 효과적.

3.3.7. Index Skip Scan ⭐️

  • BETWEEN 일 때도 유용.
  • 3.3.8. IN 조건이 '=' 인가. ⭐️*
  • 필터조건임.
  • '=' 가 되기 위해서는 IN-List Iterator 방식으로 수행해야 함.
  • in-list 를 엑세스 조건 / 필터 조건으로 유도하는 방법
  • 3.3.9. BETWEEN 과 LIKE 스캔 범위 비교*
  • 범위조건 검색이라서, 범위 검색 시의 비효율 원리가 같다.
  • between vs like
    • like 가 포함하는 범위가 더 넓은 경우가 많음. (2019%인지 201904부터인지. )
  • 3.3.10. 범위 조건 검색을 남용 시 생기는 비효율*
  • 3.3.11. 다양한 옵션 조건 처리 방식의 장단점 비교*
  • OR

  • LIKE/BETWEEN
    • like 주의사항
      • like 는 숫자형도 문자형으로 변환되기 때문에 주의
      • 가변 길이 칼럼
      • 사용하려면
  • UNION ALL
    • 인덱스를 가장 쉽게 사용할 수 있는 방식.
  • NVL/DECODE 함수 활용

  • 3.3.12. 함수 호출 부하 해소를 위한 인덱스 구성*
  • PL/SQL 사용자 함수의 성능적 특성
    • 매우 느림.
    • 가상머신 상에서 실행되는 인터프리터 언어라서.
    • 컨텍스트 스위칭
    • recursive call
  • 사용할 수 밖에 없다면 함수 호출 줄이기 :
    • 인덱스 칼럼 단에서 최소한으로 만들기