2장. 인덱스 기본

jisu park·2025년 5월 9일
0

친절한 SQL 튜닝

목록 보기
1/2

인덱스 테이블에서 소량 데이터 검색시 사용한다.


성능목표

  1. 인덱스 스캔 과정에서의 비효율줄이기
    설명-> 인덱스 자체를 소량만 scan 하도록
  2. 테이블 엑세스 횟수 줄이기 ~~~> 이게 더 중요
    설명-> 어떤 인덱스를 사용하느냐에 따라 table 랜덤 엑세스 횟수가 달라짐

SQL 튜닝은 랜덤 디스크 I/O를 최소화 하는것!


수직적탐색 vs 수평적 탐색

제목설명
수직적 탐색인덱스 스캔 '시작지점'을 찾는 과정
수평적 탐색데이터를 찾는 과정
  • 인덱스 스캔 시작지점 : 단순히 조건을 만족하는 레코드가 아니라, 조건을 만족하는 첫 번 째 레코드
  • 탐색 순서:
    --수직적탐색 시작
  1. 인덱스 루 트 블 록 에서 찾고자하는 값보다 큰 첫번째 레코드를 만나면
  2. 그 레코드 바로 직전 레코드가 가리키는 하 위 블 록 으로 이동
  3. 1-2 반복하다 리 프 블 록 에 도착했다면
    --수평적탐색 시작
  4. 조건을 만족하는 첫번째 레코드 찾고
  5. 거기서부터 쭈욱 수평탐색하며 찾는 값보다 더 큰 값 만나면 멈추기

인덱스 Range Scan 하기위해서는?

1. 조건절에 있는 인덱스 컬럼을 가공하면 안됨

-> ex) 생년월일 컬럼이 인덱스컬럼이라 할지라도,
where SUBSTR(생년월일)='05'
이런식으로 있으면 인덱스 못탐
(함수, like, or 등 )

2. 조건절에 인덱스 선두컬럼이 있어야함 (no 가공)

-> ex) idx1 = [종목코드, 종목명] 으로 인덱스 구성되어있다고 할때,
where 종목명='야구' 이런식이면
종목코드-종목명 순으로 인덱스순서가 배치되어있을거니까
같은 종목명이라고 해도 여러 리프블록에 띄엄띄엄 배치되어있을 가능성 있어서 range scan은 못함


깨알 지식

1. B*Tree 인덱스란?

B는 Balanced 의 약자로, 어떤 값을 탐색하더라도 인덱스 루트블록- 인덱스 리프블록에 도달하기까지 읽는 블록수가 같다는 뜻 !

2. OR expansion 이란?

WHERE 전화번호 := tel_no OR 고객명 := cust_no
에 대해
옵티마이저가 아래와 같이 변환하여 수행 CONCATENATION

select * from where 전화번호 := tel_no
UNION ALL
select * from where 고객명 := cust_no
~~~~~

3. IN-List Iterator 란?

in list 갯수만큼 옵티마이저가 index range scan 반복한다
where 종목 in ('야구','축구')

select * from A where 종목='야구'
UNION ALL
select * from A where 종목='축구'

4. 결합인덱스란?

ex) 인덱스가 [소속팀,사원명,연령] 이런식으로 구성되어있다 한다면
이 결합인덱스는
1. 소속팀 순으로 정렬
2. 소속팀이 같으면 사원명 순으로 정렬
3. 사원명이 같으면 연령순으로 정렬
이 순서로 정렬될 것이다.

5. DBMS 에서 제공하는 데이터 자동 형변환은 인덱스를 못타게 하는 주범

-> 코딩을 할때 컬럼과 검색할 값의 데이터 타입을 맞추는 습관을 들이자!
ex) 생년월일 컬럼이 문자형이고, 아래와 같이 쓴다면
where 생년월일 = 19960101
옵티마이저는 자체적으로 where TO_NUMBER(생년월일)=19960101
로 인덱스 컬럼을 가공하기때문에 인덱스를 타지 않는다 ! -> 성능 안좋아질 수 있음

  • '=' 조건일때는 아래와 같다

    숫자형 > 문자형
    -> 숫자형이 힘이 더 세서 문자형에 자동으로 TO_NUMBER 적용됨
    날짜형 > 문자형
    -> 날짜형이 힘이 더 세서 문자형에 자동으로 TO_DATE 적용됨

  • 'LIKE' 조건일때는 아래와 같다.

    숫자형 < 문자형
    숫자형 컬럼을 like 조건으로 검색 시 자동 형변환 발생 TO_CHAR 적용됨


인덱스 스캔 종류

  1. INDEX RANGE SCAN
  2. INDEX FULL SCAN
  3. INDEX UNIQUE SCAN
  4. INDEX SKIP SCAN
  5. INDEX FAST FULL SCAN
profile
DB MASTER⭐

0개의 댓글