row수가 적은 table이나 row 길이가 짧은 table에 대해, 빈번하게 update나 select를 행하면, 전체 노드로부터 경합이 이루어진다.
application에서 사용하는 table예시
queue에서 사용되는 table
session이나 job의 상태관리 테이블
session 상태 관리: 로그인 상태, 웹 애플리케이션의 세션 데이터
job 상태: 배치 작업의 실행 상태
마지막에 행한 처리를 확인하는 테이블
PCTFREE를 증가시키는 것으로, 1개 블록당 행 수를 감소시키는 것이 가능하다.
블록 내 기존의 행을 갱신할 경우에 대비하여 data block내에 빈 영역으로써 보관되는 비율을 최소치로 설정한다.
예를 들어, CREATE TABLE문에서 다음과 같이 parameter를 설정한다. PCTFREE 20
CREATE TABLE emp (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
salary NUMBER
) PCTFREE 20;
즉, 한 블록이 완전히 꽉 차지 않도록 남겨둠으로써, update시 블록 분할(block split), 또는 row migration(행 마이그레이션)을 방지하는 역할을 한다.ex) PCTFREE 20, PCTUSED 40이면
- 블록이 80%까지 채워지면 insert 불가
- 데이터가 삭제되어 블록 사용률이 40% 미만이 되면 다시 insert 가능
[ FREELIST에 추가 및 제거되는 과정 ]
INSERT 가능 블록 목록 (FREELIST)
┌────────┬───────┬─────────┐
│ BLK 1 │ BLK 2 │ BLK 3 │ ← INSERT 가능
└────────┴───────┴─────────┘
↓ (INSERT 발생하여 BLK 1이 꽉 참 → FREELIST에서 제거됨)
┌────────┬───────┐
│ BLK 2 │ BLK 3 │ ← INSERT 가능
└────────┴───────┘
↓ (DELETE 발생하여 BLK 1이 일정 수준 이하로 비워짐)
┌─────────┬───────┬───────┐
│ BLK 1 │ BLK 2 │ BLK 3│ ← INSERT 가능 (BLK 1 다시 추가)
└─────────┴───────┴───────┘
동작 방식
- 데이터블록에 트랜잭션 슬롯이 생성됨
- 트랜잭션이 실행될 때마다 슬롯을 차지함
- INITRANS를 초과하는 경우, 남은 공간을 사용하여 추가 슬롯 생성 (하지만 블록 내 공간이 부족하면 경합 발생이 가능)