SQL에서 데이터 저장 구조의 성능 이슈를 이해하려면 ROW MIGRATION과 ROW CHAINING 개념을 알아야 합니다. 이 글에서는 두 개념의 차이점, 발생 원인, 해결 방법을 정리합니다.
ROW CHAINING은 하나의 행(row)이 너무 커서 블록 하나에 저장되지 못하고 여러 데이터 블록에 나눠 저장되는 현상입니다.
PCTFREE 조정OUT-OF-LINE 저장 방식 고려ROW MIGRATION은 기존 블록에 있던 행이 수정으로 인해 커지면서 다른 블록으로 이동하는 현상입니다. 단, ROWID는 그대로 유지됩니다.
UPDATE로 행 크기 증가-- 처음에는 '홍길동'만 저장
INSERT INTO EMP (ENAME) VALUES ('홍길동');
-- 이후 ENAME을 길게 UPDATE
UPDATE EMP SET ENAME = RPAD('홍길동', 500, '*');
UPDATE 후 블록 공간 부족 → 다른 블록으로 이동PCTFREE를 늘려 여유 공간 확보ALTER TABLE MOVE)| 구분 | ROW CHAINING | ROW MIGRATION |
|---|---|---|
| 발생 조건 | 한 행 크기 > 블록 크기 | UPDATE로 행 크기 증가 + 공간 부족 |
| 주요 원인 | 컬럼 많거나 대용량 컬럼 | 기존 블록에 여유 공간 없음 |
| 저장 위치 | 여러 블록에 나눠 저장됨 | 다른 블록으로 이동 + 포인터 남김 |
| 성능 영향 | 여러 블록 접근 → 읽기 성능 저하 | 포인터 탐색 필요 → 읽기 성능 저하 |
| 해결 방법 | 컬럼 구조 개선, LOB 최적화 | PCTFREE 조정, 정기 재구성(MOVE) |
Oracle에서는 아래 SQL로 테이블의 Row Migration / Chaining 상태를 점검할 수 있습니다:
ANALYZE TABLE 테이블명 LIST CHAINED ROWS;
결과는 CHAINED_ROWS 테이블에 저장되며, 이를 조회하여 성능 분석 가능
ROW CHAINING은 행이 너무 커서 블록에 못 들어가는 경우,ROW MIGRATION은 UPDATE 등으로 인해 다른 블록으로 이동하는 경우입니다.PCTFREE, BLOCK SIZE, 정기 점검 등을 통해 최적화가 필요합니다.