Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발의변화

인덱스 스캔 본문

데이터베이스

인덱스 스캔

refindmySapporo 2024. 3. 18. 21:54
반응형

조건절 1

WHERE C1 = 'B'

수직적 탐색을 통해 C1 = 'B'인 첫 번째 레코드를 찾고, 'C'를 만나는 순간 스캔을 멈춘다.
루트블록 스캔과정에 C1 = 'B'인 레코드를 찾았을 때 그 직전 (C1 ='A')레코드가 가리키는 리프 블록 2로 내려간다.
왜냐하면 C1 = 'B'인 레코드가 가리키는 리프블록 3을 시작으로 조건에 맞는 데이터를 만날 수 있지만 리프블록 2에 존재할 수 있기에 시작점이 아니다.

조건절 2

WHERE C1 = 'B'
AND C2 = 3

C1 = 'B'에서 수직적 탐색을 타면 안되고 그 직전 리프블록 2로 내려가야 한다.

조건절 3

WHERE C1 = 'B'
AND C2 >= 3

C2 >= 3 조건절이 스캔을 멈추는데 역할을 못하지만
이 조건절로 인해 스캔 시작점을 결정하는데 중요한 역할을 함

조건절 4

WHERE C1 = 'B'
AND C2 <= 3

C2 <= 3 조건절은 수직적 탐색 과정에 전혀 쓰이질 못하지만 스캔을 멈추는데 중요한 역할을 했다.

조건절 5

WHERE C1 = 'B'
AND C2 BETWEEN 2 AND 3

C1과 C2 조건절 모두 스캔 시작과 끝 시점에서 중요한 역할을 했다.
수직적 탐색을 하기 위해 2번 리프노드에서 시작을 하고 C2 =3인 레코드보다 값이 큰 레코드를 만나는 순간 스캔을 멈춘다.

조건절 6

WHERE C1 BETWEEN 'A' AND 'C'
AND C2 BETWEEN 2 AND 3

C1 조건절은 스캔 시작과 끝 지점을 결정하는데 중요한 역할이지만 C2는 스캔량을 줄이지 못했다.

인덱스 스캔 효율화

WHERE c1 ='성'
AND c2 = '능'
AND c3 = '검'

총 3건을 스캔

WHERE c1 = '성'
AND c2 = '능'
AND c4 = '선'

풀 스캔

이유는?
인덱스 선행 컬럼이 조건절에 없기 때문 -> C4보다 앞선 선행 컬럼 C3가 조건절에 없기 때문이다.
인덱스 선행 컬럼이 조건절에 없거나 '=' 조건이 아니면 인덱스 스캔 과정에 비효율이 발생한다.

인덱스 스캔 효율성 측정

엑세스 조건과 필터 조건

엑세스 조건: 인덱스 스캔 범위를 결정하는 조건절
인덱스 필터 조건: 테이블로 엑세스할지를 결정하는 조건절

비교 연산자 종류와 컬럼 순서에 따른 군집성

'같은 값'을 찾을 떄 '=' 연산자를 사용하므로 인덱스 컬럼을 앞쪽부터 누락없이 '='연산자로 조회하면 조건절을 만족하는 레코드 모두 모임
어느 하나를 누락하거나 '=' 조건이 아닌 연산자로 조회하면 조건절을 만족하는 레코드가 서로 흩어진 상태

  • 좌변 컬럼을 가공한 조건절
  • 왼쪽 '%' 또는 양쪽 '%' 기호를 사용한 like 조건절
  • 같은 컬럼에 대한 조건절이 두 개 이상, 인덱스 액세스 조건으로 선택되지 못한 조건절
  • OR Expension 또는 INLIST ITERATOR로 선택되지 못한 OR 또는 IN 조건절

인덱스 선행컬럼이 등치조건이 아닐 떄 생기는 비효율

인덱스 컬럼 중 일부가 조건절에 없거나 등치 조건이 아니더라도, 그것이 뒤쪽 컬럼일 때는 비효율이 없다.

반면 인덱스 선행 컬럼이 조건절에 없거나 부등호, BETWEEN, LIKE 같은 범위검색 조건이면, 인덱스를 스캔하는 단계에서 비효율이 생긴다.

부등호, BETWEEN, LIKE 같은 범위검색 조건이면 비효율이 생긴다.
인덱스 선행 컬럼이 모두 '=' 조건일 때 필요한 범위만 스캔하고 멈출 수 있는 것은, 조건을 만족하는 레코드가 모두 한데 모여 있기 때문이다.

BETWEEN을 IN-LIST로 전환

IN-LIST를 사용하면 해당 LIST만 판단하기 떄문에 '='을 union all한 것이랑 마찬가지로 Index Skip Scan방식을 유도할 수 있다.
하지만 IN-LIST 조건일 떄 좌측의 개수가 많다면 수직적 탐색이 많이 생겨 오히려 비효율이 클 수 있다. 특히 Depth가 더 커질수록 그렇다.

그러므로 데이터 분포나 수직적 탐색 비용을 따져서 BETWEEN을 IN-List로 변환해야 한다.

Index Skip Scan

선투컬럼이 BETWEEN이어서 나머지 검색 조건을 만족하는 데이터들이 서로 멀리 떨어져 있을 때 index skip scan의 위력이 나타난다.

IN조건은 '=' 인가

between 절을 IN-LIST Iterator 방식으로 풀리지 않으면 테이블 전체 또는 인덱스 전체를 스캔해야 하는 비효율성이 증가한다.

BETWEEN, LIKE 성능 비교

BETWEEN이 더 빠르다.

LIKE/BEWEEN 패턴

  1. 인덱스 선두 컬럼
  2. NULL 허용 컬럼
  3. 숫자형 컬럼
  4. 가변 길이 컬럼
    에 대해 주의하면서 연산자를 활용해야 한다.
반응형

'데이터베이스' 카테고리의 다른 글

옵티마이저  (0) 2024.03.20
인덱스 튜닝  (0) 2024.03.14
인덱스 구조 및 탐색  (0) 2024.03.13
SQL 처리과정과 I/O  (0) 2024.03.12
트랜잭션  (0) 2024.03.11