SQL & 데이터베이스/SQL 성능 최적화 & 튜닝
SQL 인덱스(Index) 최적 활용법: 클러스터형 vs 비클러스터형
Jinsapp
2025. 3. 19. 21:12
[SQL] SQL 인덱스(Index) 최적 활용법: 클러스터형 vs 비클러스터형
1. 인덱스(Index)란?
인덱스(Index)는 데이터베이스 검색 성능을 최적화하기 위한 구조입니다.
책의 목차처럼, 인덱스를 활용하면 전체 테이블을 스캔하는 대신 필요한 데이터 위치를 빠르게 찾을 수 있습니다.
2. 인덱스의 종류
종류 | 설명 |
---|---|
클러스터형 인덱스 (Clustered Index) | 데이터가 실제 정렬된 상태로 저장되며, 테이블당 하나만 생성 가능 |
비클러스터형 인덱스 (Non-Clustered Index) | 데이터가 원래 순서와 무관하며, 하나의 테이블에 여러 개 생성 가능 |
---
3. 클러스터형 인덱스 (Clustered Index)
클러스터형 인덱스는 테이블의 실제 데이터가 정렬된 상태로 저장되는 인덱스입니다.
한 테이블에는 **하나의 클러스터형 인덱스만 생성 가능**합니다.
✔ 클러스터형 인덱스 예제
-- Primary Key는 기본적으로 클러스터형 인덱스를 생성함
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
department VARCHAR2(50)
);
✅ 특징:
- 테이블의 물리적 저장 순서를 결정
- 한 개의 테이블에 하나만 존재 가능
- 검색 속도가 빠름(특히 범위 검색 시 효과적)
- INSERT/DELETE 성능이 저하될 수 있음 (데이터 정렬 유지 필요)
✔ 클러스터형 인덱스를 활용한 검색 예제
SELECT * FROM employees WHERE emp_id = 1001;
✅ 검색 최적화:
- `emp_id`가 클러스터형 인덱스로 설정되었으므로 빠르게 검색 가능
- 범위 검색 (BETWEEN, ORDER BY 등)에서 뛰어난 성능을 보임
4. 비클러스터형 인덱스 (Non-Clustered Index)
비클러스터형 인덱스는 데이터 저장 순서와 무관하게 별도의 인덱스 페이지에 저장됩니다.
한 테이블에 여러 개의 비클러스터형 인덱스를 생성할 수 있습니다.
✔ 비클러스터형 인덱스 예제
-- 특정 컬럼에 대한 비클러스터형 인덱스 생성
CREATE INDEX idx_employee_name ON employees(name);
✅ 특징:
- 데이터 정렬과 무관하게 저장
- 한 개의 테이블에 여러 개 생성 가능
- 조회 성능 향상 (WHERE 절 조건에 적합)
- INSERT/UPDATE 성능에 영향*(인덱스 추가/삭제 필요)
✔ 비클러스터형 인덱스를 활용한 검색 예제
SELECT * FROM employees WHERE name = 'John Doe';
✅ 검색 최적화: -
`name` 컬럼에 비클러스터형 인덱스가 설정되어 있으면, 전체 테이블 스캔 없이 빠르게 검색 가능
- 다만, ORDER BY 또는 범위 검색에는 성능이 떨어질 수 있음
5. 클러스터형 vs 비클러스터형 인덱스 비교
구분 | 클러스터형 인덱스 | 비클러스터형 인덱스 |
---|---|---|
데이터 정렬 | 실제 데이터가 인덱스 순서로 저장됨 | 데이터 저장 순서와 무관 |
테이블당 개수 | 1개 (Primary Key에 기본 생성) | 여러 개 가능 |
조회 성능 | 범위 검색 (ORDER BY, BETWEEN) 최적화 | 단일 조회 (WHERE 조건) 최적화 |
INSERT/DELETE 성능 | 데이터 정렬 유지 필요 → 성능 저하 가능 | 데이터 정렬 무관 → 상대적으로 영향 적음 |
---
6. 인덱스 성능 최적화 팁
- ✔ **자주 조회하는 컬럼에 인덱스 적용 (WHERE, JOIN, ORDER BY에서 사용되는 컬럼)**
- ✔ **너무 많은 인덱스 생성 시 INSERT/UPDATE 성능 저하 발생 가능 → 필요한 인덱스만 유지**
- ✔ **조인(JOIN) 성능을 높이려면 조인되는 컬럼에 인덱스 설정**
- ✔ **클러스터형 인덱스는 범위 검색이 많은 경우에 유리, 비클러스터형 인덱스는 WHERE 조건에 최적화**
---
📌 정리
- ✔ **클러스터형 인덱스:** 데이터가 인덱스 순서대로 정렬됨 → 범위 검색 최적
- ✔ **비클러스터형 인덱스:** 저장 순서와 무관 → WHERE 조건 검색 최적
- ✔ **테이블당 1개 클러스터형 인덱스 가능, 비클러스터형 인덱스는 여러 개 가능**
- ✔ **조인, ORDER BY, WHERE 절에 자주 사용되는 컬럼에 적절한 인덱스 적용**
🔗 다른 SQL 성능 최적화 관련 글도 함께 확인해보세요!