ROW MIGRATION & ROW CHAINING 정리

박우진·2025년 5월 28일

SQLD

목록 보기
11/12

SQL에서 데이터 저장 구조의 성능 이슈를 이해하려면 ROW MIGRATIONROW CHAINING 개념을 알아야 합니다. 이 글에서는 두 개념의 차이점, 발생 원인, 해결 방법을 정리합니다.


1. ROW CHAINING (행 연결)

개념

ROW CHAINING하나의 행(row)이 너무 커서 블록 하나에 저장되지 못하고 여러 데이터 블록에 나눠 저장되는 현상입니다.

발생 원인

  • 테이블의 컬럼 수가 많거나 LOB, LONG 등 대형 데이터 타입을 사용할 경우
  • BLOCK 크기보다 큰 행이 삽입될 때

예시

  • 한 행의 크기가 10KB인데 DB 블록 크기가 8KB인 경우 → 1개의 행이 두 블록에 걸쳐 저장됨

영향

  • 데이터를 읽을 때 여러 블록에 접근 → I/O 성능 저하

해결 방법

  • PCTFREE 조정
  • 컬럼 설계 최적화 (큰 컬럼 분리)
  • LOB 데이터는 OUT-OF-LINE 저장 방식 고려

2. ROW MIGRATION (행 이동)

개념

ROW MIGRATION기존 블록에 있던 행이 수정으로 인해 커지면서 다른 블록으로 이동하는 현상입니다. 단, ROWID는 그대로 유지됩니다.

발생 원인

  • 기존 블록 공간이 부족한 상태에서 UPDATE로 행 크기 증가
  • 새 블록으로 이동하면서 기존 블록에는 포인터만 남음

예시

-- 처음에는 '홍길동'만 저장
INSERT INTO EMP (ENAME) VALUES ('홍길동');

-- 이후 ENAME을 길게 UPDATE
UPDATE EMP SET ENAME = RPAD('홍길동', 500, '*');
  • 처음엔 한 블록에 저장 → UPDATE 후 블록 공간 부족 → 다른 블록으로 이동

영향

  • 데이터 접근 시 간접 접근 발생 → 성능 저하
  • 인덱스 탐색 시 추가 I/O 발생

해결 방법

  • PCTFREE를 늘려 여유 공간 확보
  • 과도한 UPDATE 발생 테이블은 정기적으로 재정렬 (ALTER TABLE MOVE)

3. 두 개념 비교 요약

구분ROW CHAININGROW MIGRATION
발생 조건한 행 크기 > 블록 크기UPDATE로 행 크기 증가 + 공간 부족
주요 원인컬럼 많거나 대용량 컬럼기존 블록에 여유 공간 없음
저장 위치여러 블록에 나눠 저장됨다른 블록으로 이동 + 포인터 남김
성능 영향여러 블록 접근 → 읽기 성능 저하포인터 탐색 필요 → 읽기 성능 저하
해결 방법컬럼 구조 개선, LOB 최적화PCTFREE 조정, 정기 재구성(MOVE)

4. 확인 방법

Oracle에서는 아래 SQL로 테이블의 Row Migration / Chaining 상태를 점검할 수 있습니다:

ANALYZE TABLE 테이블명 LIST CHAINED ROWS;

결과는 CHAINED_ROWS 테이블에 저장되며, 이를 조회하여 성능 분석 가능


마무리

  • ROW CHAINING행이 너무 커서 블록에 못 들어가는 경우,
    ROW MIGRATIONUPDATE 등으로 인해 다른 블록으로 이동하는 경우입니다.
  • 둘 다 성능 저하의 원인이 되므로, 테이블 구조 설계 시 예방하고,
    PCTFREE, BLOCK SIZE, 정기 점검 등을 통해 최적화가 필요합니다.

0개의 댓글