Oracle - Clustering Factor

Oracle - Clustering Factor

데이터베이스에서는 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 모여있는 정도를 의미한다.

인덱스 클러스터링 팩터가 좋다. 고 하면 인덱스 정렬 순서테이블 정렬 순서 가 서로 비슷하다는 것을 말한다.

  1. Index Scan의 Cost에 큰 영향을 준다.
  2. Index Lookup을 통해 Data를 읽는 일량을 결정한다.

Clustering Factor 이해하기

Clustering Factor(CF)는 인덱스 통계 정보 중 하나로, 인덱스를 통해 테이블 데이터를 액세스할 때 발생하는 물리적 I/O 양을 예측하는 데 사용된다.

CF 값의 범위

  • 최소값: 테이블 블록 수와 같음 (가장 좋은 경우)
  • 최대값: 인덱스 레코드 수와 같음 (가장 나쁜 경우)
-- Clustering Factor 확인
SELECT index_name, clustering_factor, num_rows, leaf_blocks
FROM user_indexes
WHERE table_name = 'YOUR_TABLE';

CF가 좋은 경우 vs 나쁜 경우

좋은 CF (Low CF)
  • 인덱스 정렬 순서와 테이블 정렬 순서가 일치
  • 같은 블록에서 연속된 데이터를 읽을 수 있음
  • 물리적 I/O 감소
  • Index Range Scan 성능 향상
나쁜 CF (High CF)
  • 인덱스 정렬 순서와 테이블 정렬 순서가 불일치
  • 매번 다른 블록을 읽어야 함
  • 물리적 I/O 증가
  • Full Table Scan이 더 효율적일 수 있음

CF 개선 방법

  1. 테이블 재생성

    -- 인덱스 컬럼 순서로 테이블 재생성
    CREATE TABLE new_table AS
    SELECT * FROM old_table
    ORDER BY indexed_column;
  2. CTAS (Create Table As Select) 사용

    CREATE TABLE table_name_new AS
    SELECT * FROM table_name
    ORDER BY column_name;
  3. IOT (Index Organized Table) 고려

    • 테이블 데이터가 인덱스 구조로 저장됨
    • CF 개념이 적용되지 않음
  4. 파티셔닝 활용

    • 논리적으로 데이터를 분할하여 CF 영향 최소화

실제 예제

-- CF가 나쁜 경우
-- 100,000건 조회 시 100,000번의 블록 I/O 발생 가능

-- CF가 좋은 경우
-- 100,000건 조회 시 1,000번의 블록 I/O 발생 (블록당 100건 저장)

-- 통계 정보 확인
SELECT
a.table_name,
a.index_name,
a.clustering_factor,
b.num_rows,
b.blocks,
ROUND(a.clustering_factor / b.blocks, 2) as cf_ratio
FROM user_indexes a, user_tables b
WHERE a.table_name = b.table_name
AND a.table_name = 'YOUR_TABLE';

CF와 옵티마이저

옵티마이저는 CF 값을 참고하여 실행 계획을 결정한다:

  • CF가 낮을 때: Index Range Scan 선호
  • CF가 높을 때: Full Table Scan 선호
-- 실행 계획 확인
EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

주의사항

  • CF는 통계 정보 수집 시 계산됨
  • 데이터 변경이 많은 테이블은 주기적인 통계 수집 필요
  • DML 작업이 많을수록 CF가 나빠질 수 있음
  • CF 개선을 위한 테이블 재생성은 다운타임을 고려해야 함
Share