Oracle FreeList (프리리스트)

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를 유지하여 성능 최적화

Leave a Comment