2025-05-13
B-tree 인덱스 이해하기
DatabaseIndexB-treeOracleSQL
B-tree 인덱스 이해하기
인덱스란
인덱스는 "책의 목차"와 같은 역할을 합니다. 전체 테이블을 스캔하지 않고도 특정 값을 빠르게 찾을 수 있게 해줍니다. 테이블 크기가 클수록 성능 향상이 비례적으로 증가하며, Oracle은 기본적으로 B-tree 인덱스를 사용합니다.
B-tree 인덱스란
B-tree 인덱스는 정렬된 키 값을 가진 균형 트리 구조를 사용하여 O(log n) 검색 복잡도를 제공합니다.
- Root 노드 → Branch 노드 → Leaf 노드
- Leaf 노드는 실제 테이블 레코드를 가리키는 ROWID 포인터를 포함
트리 구조 예시:
[50]
/ \
[10, 30] [60, 90]
이 구조는 범위 검색(BETWEEN, LIKE 'A%')에 탁월합니다.
인덱스 전후 성능 비교
-- 테이블 생성
CREATE TABLE users (
id NUMBER PRIMARY KEY,
username VARCHAR2(100),
email VARCHAR2(100)
);
-- 10만 건 데이터 삽입
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO users VALUES (i, 'user_' || i, 'user_' || i || '@test.com');
END LOOP;
COMMIT;
END;
-- 인덱스 적용 전 검색
SET AUTOTRACE ON
SELECT * FROM users WHERE email = 'user_99999@test.com';
-- 결과: Full Table Scan
-- 인덱스 적용 후 검색
CREATE INDEX idx_users_email ON users(email);
SELECT * FROM users WHERE email = 'user_99999@test.com';
-- 결과: Index Range Scan + Table Access by ROWIDB-tree 인덱스의 특징
| 항목 | 설명 |
|------|------|
| 정렬 기반 | 컬럼 값을 오름차순으로 저장 |
| 빠른 탐색 | O(log n) 복잡도로 수백만 건도 효율적 처리 |
| 범위 검색 가능 | >, <, BETWEEN, LIKE 'A%' 지원 |
| 단점 | DML 작업이 유지보수 비용을 증가시킴 |
실무 팁
- 인덱스는 SELECT를 빠르게 하지만 DML 성능이 저하될 수 있음
- WHERE 조건에 자주 사용되는 컬럼에 인덱스를 고려
- ORDER BY나 JOIN에 사용되는 컬럼도 평가 대상
- 함수 기반 인덱스로
UPPER(name)같은 조건도 처리 가능
CREATE INDEX idx_upper_name ON users(UPPER(username));