1. FreeList란?
FreeList(프리리스트)는 Oracle 데이터베이스에서 새로운 데이터가 삽입될 때 사용할 수 있는 빈 블록 목록입니다.
즉, INSERT 작업이 수행될 때, 사용 가능한 공간이 있는 블록을 찾는 역할을 합니다.
✔ FreeList의 역할
- INSERT 성능 향상: 새로운 데이터 삽입 시 사용 가능한 블록을 빠르게 찾음
- 병렬 처리 최적화: 여러 세션에서 동시 INSERT 시 블록 경합(Contension) 방지
- 공간 활용 최적화: DELETE 후 공간을 재활용할 수 있도록 관리
2. FreeList 동작 방식
Oracle의 테이블이나 인덱스는 데이터를 저장할 때 블록(Block) 단위로 관리됩니다.
새로운 데이터가 삽입될 때, FreeList에서 빈 블록을 먼저 검색하여 데이터를 저장하며, FreeList에 사용 가능한 블록이 없으면 새로운 블록을 할당합니다.
(1) FreeList가 있는 경우
✅ INSERT 수행 시 FreeList에서 사용 가능한 블록을 찾아 삽입
✅ 블록 경합 없이 빠르게 데이터 저장 가능
📌 예제
INSERT INTO employees VALUES (1001, 'John Doe', 'IT');
✔ 결과: FreeList에서 빈 블록을 찾아 데이터를 저장 (HWM 증가 없음)
(2) FreeList가 부족한 경우
❌ FreeList에 빈 블록이 없으면 새로운 블록을 할당 (HWM 증가 발생)
❌ 병렬 트랜잭션이 많을 경우, 블록 경합으로 인해 성능 저하 발생
📌 해결 방법
- FreeList 개수를 증가하여 병렬 INSERT 시 충돌 방지
- DELETE 후 FreeList에 공간이 추가되지 않으면 HWM을 조정(SHRINK)
3. FreeList의 관리
FreeList는 STORAGE 파라미터를 통해 테이블이나 인덱스 단위로 설정할 수 있습니다.
(1) FreeList 개수 확인
📌 테이블의 FreeList 개수 조회
SELECT SEGMENT_NAME, FREELISTS
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME = 'EMPLOYEES';
📌 인덱스의 FreeList 개수 조회
SELECT INDEX_NAME, FREELISTS
FROM DBA_INDEXES
WHERE INDEX_NAME = 'EMP_IDX';
(2) FreeList 개수 조정
테이블의 FreeList 개수를 늘리면 병렬 INSERT 성능을 최적화할 수 있습니다.
📌 FreeList 개수 증가 (INSERT 성능 향상)
ALTER TABLE employees STORAGE (FREELISTS 10);
✔ 결과: FreeList 개수를 10개로 늘려 동시에 여러 세션이 INSERT할 때 경합을 줄임
📌 인덱스 FreeList 개수 증가
ALTER INDEX emp_idx STORAGE (FREELISTS 5);
✔ 결과: 인덱스도 여러 개의 FreeList를 가질 수 있도록 설정
4. FreeList 활용 예제
(1) 병렬 트랜잭션에서 FreeList 최적화
✅ 문제점: 여러 세션에서 동시 INSERT 시 FreeList가 부족하여 블록 경합 발생
INSERT INTO sales VALUES (seq.nextval, 'ProductA', 100);
✔ 결과: FreeList가 부족하면 세션 간 블록 할당 충돌이 발생하여 성능 저하
✅ 해결 방법: FreeList 개수 증가
ALTER TABLE sales STORAGE (FREELISTS 8);
✔ 결과: 병렬 트랜잭션이 동시에 INSERT할 때 경합 없이 빈 블록을 빠르게 찾음 → 성능 향상
(2) DELETE 후 FreeList 재사용
✅ 문제점: DELETE 후에도 FreeList가 자동으로 복구되지 않으면 INSERT 시 성능 저하
DELETE FROM orders WHERE order_date < '2023-01-01';
✔ 결과: DELETE가 발생했지만 FreeList가 즉시 반영되지 않음
✅ 해결 방법: FreeList 강제 반환 (ALTER TABLE SHRINK
)
ALTER TABLE orders ENABLE ROW MOVEMENT;
ALTER TABLE orders SHRINK SPACE;
✔ 결과: FreeList가 최신화되어 새로운 데이터가 기존 블록을 재사용할 수 있도록 설정
5. FreeList Group (Freelist Group)
FreeList Group은 RAC (Real Application Clusters) 환경에서 여러 개의 FreeList를 관리하기 위한 기능입니다.
📌 FreeList Group 개수 조정
ALTER TABLE sales STORAGE (FREELIST GROUPS 4);
✔ 결과: RAC 환경에서 각 노드별로 독립적인 FreeList를 유지하여 성능 최적화