인덱스 클러스터링 팩터(Clustering Factor)

구분좋은 상태 (Good)나쁜 상태 (Bad)
수치 근사치테이블의 블록(Block) 수에 가까움테이블의 행(Row) 수에 가까움
인덱스 키 순서와 테이블 로우(Row)의 물리적 위치가 비슷함. (데이터가 뭉쳐 있음)인덱스 키 순서와 테이블 로우의 물리적 위치가 전혀 다름. (데이터가 흩어져 있음)
I/O 효율한 번 읽은 블록에 다음 데이터도 있을 확률이 높음 (효율적)매번 새로운 블록을 읽거나 버퍼 캐시에서 밀려난 블록을 다시 읽어야 함 (비효율적)
성능 영향인덱스 범위 스캔(Range Scan) 시 매우 빠름인덱스 스캔보다 차라리 전체 테이블 스캔(Full Scan)이 유리할 수 있음
계산법

역할

옵티마이저(Optimizer)가 실행 계획을 세울 때 이 인덱스를 쓸지 말지 결정하는 결정적인 요소

  1. 비용 계산의 핵심:
    1. 쿼리 실행 비용(Cost) 계산식에서 CF는 큰 비중을 차지한다. CF가 높으면(나쁘면) 옵티마이저는 “인덱스를 타는 것보다 그냥 테이블 전체를 한 번에 읽는 게 낫겠다”고 판단하여 Full Table Scan을 선택할 확률이 높아짐.
  2. 랜덤 액세스 부하:
    1. 인덱스를 통한 테이블 액세스는 ‘Single Block I/O’ 방식의 랜덤 액세스. CF가 나쁘면 똑같은 1,000건을 조회하더라도 1,000번의 I/O가 발생할 수 있지만, CF가 좋으면 단 몇 번의 I/O로 끝날 수 있다.

계산 원리 (Oracle 기준)

데이터베이스는 인덱스 리프 블록을 처음부터 끝까지 스캔하면서 **“지금 읽은 데이터의 테이블 블록 번호가 직전 데이터의 블록 번호와 다른가?”**를 체크합니다.

  • 블록 번호가 다르면 **카운트(+1)**를 올립니다.

  • 이 카운트의 최종값이 바로 Clustering Factor입니다.

유의점

인덱스를 아무리 재생성해도 클러스터링 팩터는 좋아지지 않는다. 클러스터링 팩터를 개선하려면 테이블을 인덱스 컬럼 순으로 정렬되도록 재구성해야 한다.

(추가 설명) 클러스터링 팩터와 손익분기점 직관 CF가 좋으면(낮으면): 인덱스 → ROWID로 접근할 때 같은/인접 블록을 많이 재사용해 I/O가 줄어들어 인덱스 액세스가 유리해지는 구간이 넓어진다(손익분기점이 오른쪽으로 이동).

CF가 나쁘면(높으면): ROWID 테이블 액세스가 더 랜덤해져 블록 접근이 증가하므로 인덱스 액세스의 이점이 빨리 사라진다(손익분기점이 왼쪽으로 이동).

CF는 인덱스를 재구성(Rebuild)한다고 해결되지 않음. 인덱스 순서가 아니라 테이블 데이터의 물리적 위치가 문제이기 때문.

  • 테이블 재구성: 인덱스 키 순서대로 데이터를 ORDER BY 하여 테이블을 다시 생성 (CTAS 등)

  • IOT(Index-Organized Table) 사용: 데이터 자체를 인덱스 리프 블록에 저장하여 CF를 물리적으로 완벽하게 만듬. (SQL Server의 클러스터형 인덱스와 유사)