인덱스 Range 탐색 결과집합의 대부분이 테이블 엑세스 단계에서 필터 조건에 의해 버려지는 레코드가 많을 때 → 인덱스 스캔 비효율이 있는 것이 아님
SQL Trace 예시
(쿼리 전체 읽은 메모리 block 수가 266,968)
특정 컬럼을 기준으로 같은 값을 갖는 데이터가 모여있는 정도를 의미한다.
인덱스 정렬 순서와 테이블 정럴 순서가 비슷하면 인덱스 클러스터링 팩터가 좋은 상태이다
테이블 엑세스량에 비해 블록 I/O가 적게 발생함으로 검색 효율 좋다.
<aside> 💡
인덱스 레코드마다 테이블 레코드를 건건히 블록 I/O를 하는데 CF가 달라도 블록 I/O 발생량에 차이가 없어야 하지 않나
: 오라클은 논리적인 블록 I/O 과정을 통해 찾아간 테이블 블록에 대한 포인트(메모리 주소값)를 바로 해제하지 않고 유지한다.(버퍼 Pinning)
그래서 다음 인덱스 레코드를 읽었는데, 직전 테이블 블록과 포인트가 같으면 논리적인 블록 I/O 과정없이 바로 테이블 블록 데이터를 읽는다.
</aside>
인덱스를 rebuild 하는 것이 아니라 테이블을 인덱스 컬럼 순으로 정렬해야 좋아진다.
Index Range Scan에 의한 테이블 엑세스가 Table Full Scan 보다 느려지는 지점을 의미한다.
<aside> 💡
참고
일반적으로는 5%~20%대에 손익분기점이 존재. CF가 좋으면 90% 수준까지 올라가고, CF가 안 좋으면 5%미만에서 결정
손익분기점을 극복하기 위한 기능