ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인덱스 스캔 효율화
    TIL 2025. 6. 6. 15:03

    출처 : 친절한 SQL 프로그래밍

     

    뭐가 좋음? 왜함?

     

    1. 인덱스 탐색

    인덱스 탐색이 가능하려면, 시작점을 알 수 있어야 함. 우리는 시작점을 알기 위해서 수직 탐색을 한다.

    * LMC(leftmost child) : 인덱스 블록의 요소 중 가장 왼쪽 값. 키 값을 가진 첫 번째 레코드보다 작거나 같은 값을 가진 레코드가 저장

     

    2. 인덱스 스캔 효율성

    효율적으로 스캔하려면? 인덱스 선행 컬럼이 모두 조건절에 존재해야 함. 인덱스 리프 블록은 인덱스대로 정렬되어 저장. 

    * 선두 컬럼과 선행 컬럼

    - 선두: 가장 앞 컬럼을 의미

    - 선행: 특정 컬럼을 기준으로 그 앞의 컬럼들을 의미

     

    3. 액세스 조건과 필터 조건

    액세스 조건: 인덱스 스캔 범위를 결정하는 조건절. 수직 탐색을 통해 스캔 시작점 결정. 리프 블록 스캔 시 멈추는 곳 결정

    인덱스 필터 조건: 범위검색 조건이후 컬럼들을 포함. 테이블 엑세스 여부를 결정

    테이블 필터 조건: 테이블 엑세스 후 최종 결과집합으로의 포함여부를 결정

     

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

    인덱스 레코드는 군집성을 가진다(= 모여있음), 첫번째 나타나는 범위검색 조건까지만 만족하는 인덱스 레코드는 모두 연속해서 모여 있지만, 그 이하 조건까지 만족하는 레코드는 비교 연산자 종류에 상관''없이'' 흩어진다.

     

    5. 인덱스 선행 컬럼이 등치(=) 조건이 아닐 때 생기는 비효율

    인덱스 컬럼의 조건절이 모두 = 일때 가장 효율이 좋음

     

    6. between을 In-List 로 전환

    between 을 사용했을 때 비효율

    위 그림은  between 연산자를 사용했을 때 발생하는 비효율이다. 3건의 데이터를 얻기 위해 13번의 테이블 엑세스를 하고 있다.

    이를 in-list 로 전환했을 때, 

     

    다음과 같이 3번의 수직 탐색을 통해, 3번의 테이블 엑세스가 가능하다.

     

    단, 주의사항

    1. in-list의 개수가 많지 않아야함. in-list 의 개수가 많아진다면, 오히려 수직탐색의 비효율성이 수평탐색을 앞지르는 결과를 초래

    2. 조건을 만족하는 테이블 레코드가 서로 멀리 떨어져 있을때가 효율. 데이터가 서로 군집되어 있다면 오히려 한번의 수직탐색 이후 수평 탐색을 통해 데이터를 조회하는 것이 효율적일 수 있다.

     

    7. Index Skip Scan 활용

    앞의 between -> ln-list 변환 과정은 where 조건절을 조작해야 가능하다. index skip scan을 활용하면 쿼리 조작 없이 같은 효과를 낼 수 있다.

     

    8. In 조건은 '=' 인가

    9. Between과 like 스캔 범위 비교

     

     

    'TIL' 카테고리의 다른 글

    OR 옵션조건과 OR Expansion  (2) 2025.06.07
    20240324 DFS  (0) 2025.03.24
    0320 중복순열 구하기_DFS  (0) 2025.03.20
    20240225  (0) 2025.02.25
    1013  (0) 2024.10.13
Designed by Tistory.