2.2 인덱스 기본 사용법

개발자 로그·2021년 5월 31일
0

친절한SQL튜닝

목록 보기
6/15
post-thumbnail

인덱스를 정상적으로 사용한다.

  • 인덱스 컬럼을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다.
  • Index Range Scan : 리프 블록에서 스캔 시작점을 찾아 거기부터 스캔하다가 중간에 멈추는 것
  • 인덱스 컬럼을 가공해도 사용할 수 있지만, 스캔 시작점을 찾을 수 없고 멈출수도 없으므로 리프 블록 전체를 스캔해야한다 ⇒ Index Full Scan

"인덱스 컬럼을 가공하면 인덱스를 정상적으로 사용 (Range Scan)할 수 없다."

인덱스 컬럼을 가공 = 좌변 가공

  • 인덱스 컬럼을 가공하면 인덱스 스캔 시작점을 찾을 수 없다
  • LIKE로 중간 값 검색하는 경우
  • OR 조건으로 검색하는 경우
  • IN 조건으로 검색하는 경우
    ⇒ UNION ALL방식으로 작성하면, 각 브랜치 별로 인덱스 스캔 시작점을 찾을수 있다
    IN 조건절의 경우 IN-List개수만큼 Index Range Scan을 반복한다
-- 인덱스 컬럼을 가공
where substr(생년월일, 5, 2) = '105'
where nvl(주문수량, 0) < 100

-- LIKE로 중간 값 검색
where 업체명 like '%대한%'

-- OR 조건으로 검색
where (전화번호 =: tel OR 고객명 =: cust_nm) 

-- IN 조건으로 검색
where 전화번호 in (:tel_no1, :tel_no2)

인덱스 사용 조건

  • 인덱스 선두 컬럼이 조건절에 있어야 한다
  • 인덱스 선두 컬럼이 가공되지 않은 상태로 조건절에 있으면 인덱스 Range Scan은 무조건 가능
    but, Range Scan을 한다고 해서 항상 성능이 좋은것은 아니다.

인덱스를 이용한 소트 연산 생략

ex) PK 인덱스 : 장비번호 + 변경일자 + 변경순번

  • PK 인덱스를 사용하고 모두 = 조건으로 검색하는 경우 옵티마이저는 SQL에 ORDER BY가 없어도 정렬 연산을 따로 수행하지 않는다.
    ⇒ PK 인덱스를 스캔하면서 인덱스 구성 마지막 컬럼 순으로 정렬되기 때문

  • 만약 정렬 연산을 생략할 수 있게 인덱스가 구성되어 있지 않다면, 실행계획에 SORT(ORDER BY)연산이 추가된다.

  • 정렬

    • ASC인 경우 : 조건을 만족하는 가장 작은 값을 찾아, 좌측으로 수직적 탐색 후 우측으로 수평적 탐색
    • DESC인 경우 : 조건을 만족하는 가장 큰 값을 찾아, 우측으로 수직적 탐색 후 좌측으로 수평적 탐색 ( Index Range Scan Descending )
profile
성장하는 개발자

0개의 댓글

관련 채용 정보