인덱스(Index)는 데이터 검색 성능을 향상시키는 중요한 구조이지만, 시간이 지나면서 단편화(Fragmentation), 희소성(Sparse), 비대화(Bloat), 데이터 불균형(Skew) 등의 문제로 인해 성능이 저하될 수 있습니다.
이 문서에서는 Index Fragmentation(인덱스 단편화) 를 비롯한 여러 인덱스 관련 문제를 정리하고, 원인과 해결 방법을 설명합니다.
✅ DELETE 후 블록이 재사용되지 않음
✅ UPDATE 시 ROWID 변경으로 인해 새로운 블록 할당
✅ INSERT가 불규칙적으로 이루어지면서 블록 간 균형이 깨짐
✅ 고빈도 데이터 변경 작업으로 인해 비효율적인 공간 사용
SELECT index_name, blevel, leaf_blocks, distinct_keys, clustering_factor
FROM user_indexes
WHERE table_name = '고객';
BLEVEL
: 인덱스 깊이 (높을수록 성능 저하 가능성 높음).LEAF_BLOCKS
: 인덱스가 차지하는 블록 수 (너무 크면 단편화 가능성).CLUSTERING_FACTOR
: 테이블과 인덱스의 정렬 정도 (값이 높을수록 테이블 정렬이 필요).💡
BLEVEL
값이 높고,LEAF_BLOCKS
가 증가했으며,CLUSTERING_FACTOR
가 증가하면 단편화 가능성 높음.
✅ Index Coalesce (공간 병합)
ALTER INDEX 고객_PK COALESCE;
✅ Index Rebuild (완전 재구성)
ALTER INDEX 고객_PK REBUILD;
✅ 새로운 테이블 생성 후 교체
CREATE TABLE 고객_NEW AS SELECT * FROM 고객;
DROP TABLE 고객;
ALTER TABLE 고객_NEW RENAME TO 고객;
✅ DELETE 후 인덱스 블록이 재사용되지 않음
✅ UPDATE로 인해 기존 ROWID가 변경되면서 새로운 블록이 할당됨
✅ INSERT, DELETE, UPDATE 연산이 반복되면서 빈 블록(희소 블록)이 증가
✅ 데이터가 고르게 분포되지 않고 특정 값에 집중될 경우 발생 가능
SELECT index_name, table_name, blocks, empty_blocks
FROM user_segments
WHERE segment_type = 'INDEX'
AND table_name = '고객';
BLOCKS
: 인덱스가 차지하는 전체 블록 수EMPTY_BLOCKS
: 사용되지 않는 빈 블록 수💡
EMPTY_BLOCKS
값이 높으면, Sparse Index 문제가 존재할 가능성이 큼
✅ Index Coalesce (블록 병합)
ALTER INDEX 고객_PK COALESCE;
✅ Index Rebuild (완전 재구성)
ALTER INDEX 고객_PK REBUILD;
SELECT index_name, table_name, leaf_blocks, blevel
FROM user_indexes
WHERE table_name = '고객';
BLEVEL
이 증가하면 인덱스가 과도하게 커진 것(비대화) 가능성 있음.
✅ 불필요한 인덱스 삭제 (DROP INDEX
)
DROP INDEX 고객_PK;
✅ 주기적으로 ALTER INDEX ... REBUILD
실행
ALTER INDEX 고객_PK REBUILD;
SELECT indexed_column, COUNT(*)
FROM 고객
GROUP BY indexed_column
ORDER BY COUNT(*) DESC;
✅ 히스토그램(Histogram) 생성
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCHEMA_NAME',
tabname => '고객',
method_opt => 'FOR COLUMNS indexed_column SIZE 254'
);
END;
✅ 비트맵 인덱스(Bitmap Index) 사용
CREATE BITMAP INDEX 고객_bitmap_idx ON 고객(성별);
✅ 파티셔닝(Partitioning) 활용
CREATE INDEX 고객_idx
ON 고객(가입일)
LOCAL;
UNUSABLE
상태가 되는 문제.TRUNCATE TABLE
, LOAD DATA
, INSERT /*+ APPEND */
사용 시 발생.SELECT index_name, status
FROM user_indexes
WHERE table_name = '고객';
STATUS
가 UNUSABLE
이면 문제 발생.✅ 인덱스 재구성 (REBUILD
)
ALTER INDEX 고객_PK REBUILD;
✅ 모든 인덱스 활성화
ALTER INDEX ALL ON 고객 REBUILD;
문제 | 원인 | 해결 방법 |
---|---|---|
Index Fragmentation | DELETE/UPDATE로 인한 단편화 | ALTER INDEX ... COALESCE , ALTER INDEX ... REBUILD |
Index Sparse | 사용되지 않는 블록 존재 | ALTER INDEX ... COALESCE |
Index Bloat | 인덱스 크기 증가 | DROP INDEX , ALTER INDEX ... REBUILD |
Index Skew | 특정 키 값에 데이터 집중 | 히스토그램 생성, 비트맵 인덱스, 파티셔닝 |
Unusable Index | TRUNCATE , APPEND 로 인한 문제 | ALTER INDEX ... REBUILD |
✅ 정기적인 인덱스 모니터링 필요 (BLEVEL
, LEAF_BLOCKS
확인)
✅ 불필요한 인덱스 삭제 (DROP INDEX
) 및 인덱스 최적화 (REBUILD
, COALESCE
) 수행
✅ 데이터 분포 분석 및 적절한 인덱싱 전략 활용
✅ 테이블 변경이 많을 경우 BITMAP INDEX
, PARTITIONING
등의 대안 검토
오늘은 AI 생태계에 혁신적인 변화를 가져올 것으로 예상되는 MCP(Model Context Protocol)에 대해 상세히 알아보겠습니다. 2024년…
1. TPM이란? TPM(Trusted Platform Module)은 국제 표준 기반의 보안 하드웨어 칩으로, 컴퓨터나 디지털 장비 내에서…
시즌2, 기대했는데... 실망도 두 배!두뇌싸움을 기대했는데, 전략도 없는 자기들만의 감정에 따른 편가르기, 정치싸움이 되어 버린…
BPF(Berkeley Packet Filter) 도어는 해커가 관리자 몰래 뒷문을 새로 만든 것입니다.해커가 명령을 내려 특정 데이터들을 뒷문을…
1. IPC의 개념과 목적 1.1 IPC란 무엇인가? IPC (Inter-Process Communication)는 운영체제 내의 서로 독립적인 프로세스…