1. FreeList와 HWM 개념
Oracle 데이터베이스에서 테이블이나 인덱스에 데이터를 저장할 때, 공간 관리와 성능 최적화를 위해 FreeList와 HWM(High Water Mark)가 중요한 역할을 합니다.
개념 | 설명 |
---|---|
FreeList | 테이블이나 인덱스에서 새로운 데이터가 삽입될 수 있는 여유 공간(블록) 목록 |
HWM (High Water Mark) | 테이블에서 한 번이라도 데이터가 기록된 가장 마지막 블록의 위치 |
2. FreeList (프리리스트)
FreeList란?
- 테이블이나 인덱스에서 새로운 데이터를 저장할 수 있는 사용 가능한 블록들의 목록
- 데이터가 삽입될 때, Oracle은 FreeList에서 빈 블록을 검색하여 데이터를 저장
- FreeList는 세션별로 관리될 수도 있고, 여러 세션이 공유할 수도 있음
FreeList 관리 방식
- INSERT 수행 시 FreeList에서 공간이 있는 블록을 선택하여 데이터 저장
- UPDATE, DELETE 시 공간이 다시 FreeList에 추가될 수 있음
- FULL TABLE SCAN이 수행될 때는 FreeList를 사용하지 않고 HWM까지 읽음
📌 FreeList 개수 조정 예제
ALTER TABLE employees STORAGE (FREELISTS 5);
- 테이블의 FreeList 개수를 5개로 설정하여 병렬 트랜잭션이 빠르게 빈 공간을 찾을 수 있도록 최적화
✔ FreeList가 중요한 이유
- FreeList를 잘 관리하면 병렬 INSERT 성능이 향상됨
- FreeList가 부족하면 세션 간 블록 경합(Contension)이 발생하여 성능 저하
3. HWM (High Water Mark, 고수위선)
HWM이란?
- 한 번이라도 데이터가 기록된 가장 마지막 블록의 위치
- Oracle은 데이터를 삽입할 때 HWM을 기준으로 새로운 블록을 사용할지 결정함
- FULL TABLE SCAN 시, HWM까지의 모든 블록을 스캔하므로 성능에 영향을 줌
✔ HWM의 특징
- 테이블에서 데이터를 삭제해도 HWM이 줄어들지 않음
- TRUNCATE 명령을 사용하면 HWM이 초기화됨
- FULL TABLE SCAN 시 HWM까지 읽기 때문에, 불필요한 I/O가 증가할 수 있음
4. FreeList와 HWM 동작 방식
(1) INSERT 시 FreeList와 HWM의 관계
단계 | 설명 |
---|---|
1. 새로운 INSERT 발생 | FreeList에서 사용 가능한 블록을 찾음 |
2. 빈 블록이 FreeList에 존재하면 | FreeList에서 가져와 데이터를 저장 |
3. FreeList에 빈 블록이 없으면 | HWM을 증가시켜 새로운 블록 할당 |
📌 FreeList 사용 예제
INSERT INTO employees VALUES (1001, 'John Doe', 'IT');
✔ 동작 방식:
- FreeList에 빈 블록이 있다면 해당 블록을 사용
- 없다면 HWM을 증가시키고 새로운 블록 할당
(2) DELETE와 HWM
데이터를 삭제해도 HWM이 줄어들지 않음.
즉, FULL TABLE SCAN 시 여전히 삭제된 블록을 스캔해야 하므로 성능 저하 가능.
📌 예제: DELETE 수행 후 HWM 유지됨
DELETE FROM employees WHERE department = 'IT';
✔ 문제점:
- DELETE 후에도 HWM이 유지되므로 FULL SCAN이 불필요한 블록을 포함하여 수행됨
- HWM을 낮추려면 TABLE REBUILD 또는 SHRINK 필요
(3) HWM 초기화 방법
✅ TRUNCATE 사용 (HWM 초기화)
TRUNCATE
명령어를 사용하면 HWM이 리셋되므로, FULL TABLE SCAN 시 불필요한 블록을 스캔하지 않음.
TRUNCATE TABLE employees;
✔ 결과:
- 테이블의 모든 데이터 삭제 + HWM 초기화
- FreeList도 재설정됨
✅ SHRINK 사용 (HWM 조정)
SHRINK SPACE
명령을 사용하면 HWM을 낮추면서 데이터를 유지할 수 있음.
ALTER TABLE employees ENABLE ROW MOVEMENT;
ALTER TABLE employees SHRINK SPACE;
✔ 결과:
- 불필요한 블록을 반환하여 HWM을 줄임
- 데이터는 유지되며, FULL TABLE SCAN 시 불필요한 블록을 스캔하지 않음
5. FreeList & HWM 성능 최적화 전략
(1) 병렬 INSERT 시 FreeList 조정
- 병렬 세션이 많은 경우, FreeList를 늘리면 INSERT 성능이 향상됨
ALTER TABLE sales STORAGE (FREELISTS 10);
✔ 결과:
- 여러 세션이 동시에 INSERT할 때 블록 경합을 줄일 수 있음
(2) DELETE 후 HWM 유지 문제 해결
- TRUNCATE 사용sql복사편집
TRUNCATE TABLE orders;
✔ HWM 초기화 + FreeList 재설정 - SHRINK 사용 (데이터 유지 필요 시)sql복사편집
ALTER TABLE orders ENABLE ROW MOVEMENT; ALTER TABLE orders SHRINK SPACE;
✔ HWM을 낮추면서 데이터 유지 가능
(3) 테이블 분할 (Partitioning) 활용
- 파티션을 사용하면 특정 데이터만 관리 가능하므로 HWM 문제 해결 가능
CREATE TABLE orders (
order_id NUMBER,
order_date DATE
)
PARTITION BY RANGE (order_date) (
PARTITION p_2023 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD')),
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
);
✔ 결과:
- 오래된 데이터만 삭제 가능 → HWM 증가 방지
- FreeList 관리가 쉬워짐
6. FreeList & HWM 비교 요약
항목 | FreeList | HWM (High Water Mark) |
---|---|---|
개념 | 사용 가능한 빈 블록 목록 | 한 번이라도 데이터가 저장된 마지막 블록 위치 |
역할 | 새로운 데이터 삽입 시 사용 가능한 공간 제공 | FULL TABLE SCAN 범위를 결정 |
INSERT 시 영향 | 빈 블록이 있으면 재사용, 없으면 HWM 증가 | FreeList에 공간이 없으면 HWM 증가 |
DELETE 후 영향 | FreeList에 공간 추가 가능 | 삭제 후에도 HWM이 줄어들지 않음 |
최적화 방법 | FreeList 개수 증가 | TRUNCATE, SHRINK SPACE 사용 |
FULL TABLE SCAN 시 영향 | 영향 없음 | HWM까지 모든 블록을 읽어야 하므로 성능에 영향 |
7. 결론
✅ FreeList는 INSERT 성능을 향상시키는 핵심 요소이며, HWM은 FULL SCAN 성능에 영향을 미치는 중요한 지표
✅ DELETE를 수행해도 HWM은 줄어들지 않으므로 TRUNCATE 또는 SHRINK를 활용하여 최적화 가능
✅ 대량의 데이터를 다루는 경우 FreeList와 HWM을 적절히 관리하면 성능을 크게 개선할 수 있음! 🚀