본문 바로가기
SQL

SQL) 001. 인덱스 스캔(Index Scan)

by 애리몽 2020. 11. 5.
반응형

<인덱스의 종류>

인덱스의 물리적 구성 방식에 따라 B*Tree(Balanced Tree Index), BITMAP, cluster로 구분되고

👀B*Tree 인덱스가 가장 보편적으로 사용된다.

 

 

 

<B*Tree 인덱스의 특징>

① B* Tree 인덱스는 언제나 균형이 맞는다(그래서 Balance). → 이는 곧, 모든 Leaf 블록이 동일한 Depth에 존재함을 의미한다.
② B* Tree 인덱스의 Leaf 블록에는 키 데이터와 키 데이터를 포함한 레코드의 물리적 주소 정보를 키 데이터 정렬 순서에 맞춰 저장한다.
③ B* Tree 인덱스의 키 데이터가 테이블에서 Update가 되면, 인덱스에서는 Delete와 Insert를 하는 것으로 처리된다.

 

 

<B*Tree 인덱스 스캔방식의 종류>

⑴ Index Unique Scan

- Index Unique Scan은 인덱스를 사용한 검색 방식 중 가장 빠른 방법이다. 이 방식을 사용하기 위해서는 기본 키 또는    Unique     

   Index가 생성되어 있어야 하며, 인덱스를 구성하고 있는 모든 컬럼이 조건절에서 '='로 비교되어야 한다.

 - 조인되는 Inner Table 과의 조인 조건에도 Unique Index 또는 기본 키 컬림이 모두 조인에 참여했을 때에만 Index       

    Unique Scan을 할 수 있다.

⑵ Index Range Scan

- 인덱스를 사용해 인덱스가 생성된 컬럼에 대해 범위 검색을 하는 방법이다.

- Unique Index를 사용하지 않거나, 비교연산자를 사용한 대다수의 경우가 이 방식으로 처리되는데, 비교연산자로는 <, <=, >, >=,

   between, like 등이 사용될 수 있다.

⑶ Index Skip Scan

- Oracle 9i부터 적용이 가능한 방식으로, 결합 인덱스의 선행 컬럼에 대한 조건이 없고, 후행 컬럼에 대한 조건만 있는 경우에 적용.

- 이 방식은 선행 컬럼 값의 중복을 제거한 값의 종류가 적은 경우에 유리하다.

⑷ Index Full Scan

- 조건절에서 인덱스 컬럼 중 하나 이상을 사용한 경우 또는 SQL에서 사용한 컬럼들이 모두 하나의 인덱스에 존재할 경우 적용되는 방

   식이다.

- 이 가운데 SQL에서 사용한 컬림들이 모두 하나의 인덱스에 존재할 경우, 인덱스를 구성하는 컬럼 중 최소한 하나의 컬럼은 Not Null

   제약 조건을 충족해야 한다. 또, 이 방식을 병렬로 처리하는 것은 불가능하다.(단일 블록 I/O 블록 단위 검색)

⑸ Index Fast Full Scan

- Select 절과 조건절에 사용된 모든 컬럼이 인덱스 컬럼으로 구성되어 있어 테이블을 검색하지 않고 인덱스의 블록만을 스캔하여

   원하는 데이터를 검색하는 방식이다. Index Full Scan 과 달리 병렬처리가 가능하나, 인덱스 키 데이터의 정렬은 보장되지 않는다.

   또, 비트맵 인덱스에 대해서는 이 방식을 적용할 수 없다.

 

 

<효율적인 스캔 방식>

1. WHERE절에 자주 등장하는 컬럼을 인덱스로 설정

2. ORDER BY절에 자주 등장하는 컬럼을 인덱스로 설정

3. 결합인덱스로 구성

  --> SELECT절에 있는 컬럼들을 잘 조합해서 인덱스로 구성한다.

  --> 결합하는 컬럼들의 순서가 중요한데

    ① WHERE절에서 equal 조건으로 많이 쓰이는 컬럼들이 앞으로 오도록

    ② 분별력이 낮은 컬럼이 앞으로 오도록

 

 

<주의할 점>

1. 인덱스를 마구잡이로 생상해서는 안 된다.

 : 인덱스는 오브젝트이기 때문에 SELECT를 제외한 INSERT,UPDATE 구문에서 사용한다면 속도가 느려진다. 

    Ex) INSERT 할 때, 인덱스가 정렬이 된 상태로 저장 되어야 하기 때문에 어느 자리에 INSERT할 지 찾아야하고(시간걸림)

           테이블뿐만 아니라 인덱스도 똑같이 적용시켜야하기 때문에 느려진다.

 

2. 인덱스를 탄다고 해서 무조건 속도가 빨라지는 건 아니다.

 : 인덱스 손익분기점이라는 게 있는데 테이블이 가지고 있는 데이터의 10~15%의 데이터를 출력할 때만 효과가 있고

    그 이상이 될 때는 오히려 풀스캔 하는 게 더 빠르다.

 

 

 

 

 

 

 

참고 사이트:

youtu.be/uO8tL0okg7Q

baseofmint.tistory.com/5

반응형