본문 바로가기
ORACLE

인덱스 재구성 ( Index Rebuilding )

by 1TAL 2025. 4. 17.

▨ 인덱스 Rebuilding의 용도

  1. 조각화(Fragmentation) 해소
    • DML 작업(INSERT/UPDATE/DELETE)으로 인해 인덱스 블록이 비효율적으로 사용될 수 있음.
    • 리빌드하면 연속적인 블록에 재정렬되어 성능 개선 가능.
  2. 디스크 공간 회수
    • 삭제된 인덱스 항목이 남아있는 블록의 공간을 다시 확보 가능.
  3. 성능 문제 해결
    • 비효율적으로 구성된 인덱스를 정리함으로써 검색 속도를 향상시킬 수 있음.
  4. 데이터 파일 이동/정리 후 사용
    • 예: 테이블스페이스 압축, 디스크 구조 변경 등.
  5. 불필요하게 커진 인덱스 크기 줄이기

 

  인덱스 Rebuilding 방법

 

1. 단일 인덱스 리빌드

ALTER INDEX 인덱스명 REBUILD;

2. ONLINE 옵션 사용 (서비스 중단 없이)

ALTER INDEX 인덱스명 REBUILD ONLINE;
※ 단, ONLINE 옵션은 Enterprise Edition에서만 지원됨 (일부 버전 제한도 있음).

 

3. 병렬 리빌드 (대용량 처리 시)

ALTER INDEX 인덱스명 REBUILD PARALLEL 16;
ALTER INDEX 인덱스명 NOPARALLEL;
※ 이후 NOPARALLEL로 다시 설정해줘야 병렬 비활성화 됩니다:
 

4. 다른 테이블스페이스로 이동하며 리빌드

ALTER INDEX 인덱스명 REBUILD TABLESPACE 새테이블스페이스명;

 

▨ 기타

  • 리빌드 작업은 리소스를 많이 사용하므로 시스템 부하를 고려해서 비업무 시간대에 수행하는 것이 좋습니다.
  • 자주 할 필요는 없음: Oracle은 대부분의 경우 인덱스를 자동으로 잘 관리함.
  • 조각화 확인
SELECT  IDX.INDEX_NAME,
                IDX.TABLE_NAME,
                IDX.BLEVEL,
                IDX.LEAF_BLOCKS,
                IDX.DISTINCT_KEYS,
                IDX.CLUSTERING_FACTOR,
                TAB.NUM_ROWS,
               ROUND(IDX.CLUSTERING_FACTOR / TAB.NUM_ROWS * 100, 2) AS CLUSTERING_RATIO
FROM    DBA_INDEXES IDX
              JOIN DBA_TABLES TAB ON IDX.TABLE_NAME = TAB.TABLE_NAME
WHERE  IDX.OWNER = 'YOUR_SCHEMA'
      AND TAB.OWNER = 'YOUR_SCHEMA'
      AND IDX.STATUS = 'VALID'
      AND IDX.BLEVEL >= 3       -- 트리 높이가 3 이상
      AND IDX.LEAF_BLOCKS > 1000;  -- 리프 블록 수가 많은 것들
  • BLEVEL : 인덱스의 높이 (높을수록 성능 저하 우려)
  • LEAF_BLOCKS : 리프 블록 개수
  • DISTINCT_KEYS : 키의 다양성
  • CLUSTERING_FACTOR : 테이블 데이터의 물리적 정렬 정도 (낮을수록 좋음)  
  • CLUSTERING_RATIO  : 80% 이상이면 조각화 가능성 있음.

 

반응형

'ORACLE' 카테고리의 다른 글

언어별 표기  (0) 2023.04.13
RAC  (1) 2023.02.28
PRAGMA AUTONOMOUS_TRANSACTION  (0) 2022.06.29
INVISIBLE  (0) 2021.03.23
PL/SQL Developer  (0) 2021.03.12