<인덱스의 종류>
인덱스의 물리적 구성 방식에 따라 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%의 데이터를 출력할 때만 효과가 있고
그 이상이 될 때는 오히려 풀스캔 하는 게 더 빠르다.
참고 사이트: