FreeList(프리리스트)는 Oracle 데이터베이스에서 새로운 데이터가 삽입될 때 사용할 수 있는 빈 블록 목록입니다.
즉, INSERT 작업이 수행될 때, 사용 가능한 공간이 있는 블록을 찾는 역할을 합니다.
✔ FreeList의 역할
Oracle의 테이블이나 인덱스는 데이터를 저장할 때 블록(Block) 단위로 관리됩니다.
새로운 데이터가 삽입될 때, FreeList에서 빈 블록을 먼저 검색하여 데이터를 저장하며, FreeList에 사용 가능한 블록이 없으면 새로운 블록을 할당합니다.
✅ INSERT 수행 시 FreeList에서 사용 가능한 블록을 찾아 삽입
✅ 블록 경합 없이 빠르게 데이터 저장 가능
📌 예제
INSERT INTO employees VALUES (1001, 'John Doe', 'IT');
✔ 결과: FreeList에서 빈 블록을 찾아 데이터를 저장 (HWM 증가 없음)
❌ FreeList에 빈 블록이 없으면 새로운 블록을 할당 (HWM 증가 발생)
❌ 병렬 트랜잭션이 많을 경우, 블록 경합으로 인해 성능 저하 발생
📌 해결 방법
FreeList는 STORAGE 파라미터를 통해 테이블이나 인덱스 단위로 설정할 수 있습니다.
📌 테이블의 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';
테이블의 FreeList 개수를 늘리면 병렬 INSERT 성능을 최적화할 수 있습니다.
📌 FreeList 개수 증가 (INSERT 성능 향상)
ALTER TABLE employees STORAGE (FREELISTS 10);
✔ 결과: FreeList 개수를 10개로 늘려 동시에 여러 세션이 INSERT할 때 경합을 줄임
📌 인덱스 FreeList 개수 증가
ALTER INDEX emp_idx STORAGE (FREELISTS 5);
✔ 결과: 인덱스도 여러 개의 FreeList를 가질 수 있도록 설정
INSERT INTO sales VALUES (seq.nextval, 'ProductA', 100);
✔ 결과: FreeList가 부족하면 세션 간 블록 할당 충돌이 발생하여 성능 저하
ALTER TABLE sales STORAGE (FREELISTS 8);
✔ 결과: 병렬 트랜잭션이 동시에 INSERT할 때 경합 없이 빈 블록을 빠르게 찾음 → 성능 향상
DELETE FROM orders WHERE order_date < '2023-01-01';
✔ 결과: DELETE가 발생했지만 FreeList가 즉시 반영되지 않음
ALTER TABLE SHRINK
)ALTER TABLE orders ENABLE ROW MOVEMENT;
ALTER TABLE orders SHRINK SPACE;
✔ 결과: FreeList가 최신화되어 새로운 데이터가 기존 블록을 재사용할 수 있도록 설정
FreeList Group은 RAC (Real Application Clusters) 환경에서 여러 개의 FreeList를 관리하기 위한 기능입니다.
📌 FreeList Group 개수 조정
ALTER TABLE sales STORAGE (FREELIST GROUPS 4);
✔ 결과: RAC 환경에서 각 노드별로 독립적인 FreeList를 유지하여 성능 최적화
윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…
안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…
1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…
과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…