반응형
/*
-- Title : [Ora12c] Block 및 Row Migration과 Row Chaining
-- Tag : oracle 오라클 블록 행 마이그레이션, 행 이전, 행 체인화
*/
■ 오라클 블록
- 고정 크기: 일반적으로 블록의 크기는 데이터베이스 생성 시 설정되는 파라미터(db_block_size)에 의해 결정되며, 한 번 설정하면 변경하기 어려움.
- 기본 크기 : 블록은 4k ~ 32k내에서 설정 하능하고 기본은 8k임.
- 물리적 저장 공간: 블록은 실제 하드 디스크 상의 물리적인 저장 공간을 의미.
- 데이터 블록 또는 페이지: 블록은 데이터 블록 또는 페이지라고도 불림.
- 다양한 데이터 저장: 블록에는 테이블 데이터, 인덱스, 세그먼트 등 다양한 종류의 데이터가 저장.
www.akadia.com/services/ora_chained_rows.html
ㅁ 헤더(Header)
- 블록의 주소: 데이터 파일 내에서 블록의 위치.
- 세그먼트 유형: 블록이 속한 세그먼트(테이블, 인덱스 등)의 종류.
- 행 디렉토리: 블록 내에 저장된 행들의 위치 정보.
- 트랜잭션 슬롯: 블록에 대한 변경 작업을 수행하는 트랜잭션 정보를 기록.
- 체크섬: 데이터 무결성을 검증하기 위한 값.
ㅁ 여유 공간(Free-space)
- 새로운 데이터 삽입: 테이블에 새로운 행을 추가할 때, 이 Free Space에 데이터가 저장.
- 데이터 수정: 기존 데이터를 수정할 때, 수정된 데이터가 기존 데이터를 덮어쓰기 위해 Free Space가 필요.
- 데이터 삭제: 데이터를 삭제하더라도 바로 공간이 회수되지 않고, 일정 시간 동안 Free Space로 유지.
ㅁ 데이터
- 실제 데이터가 저장되는 영역.
ㅁ FREELIST
- 정의: 하나의 세그먼트(테이블, 인덱스 등) 내에서 사용 가능한(free) 블록들을 관리하는 리스트.
- 목적: 새로운 데이터를 삽입할 때, Oracle은 이 FREELIST를 참조하여 사용 가능한 블록을 빠르게 찾아 데이터를 저장.
- 종류:
- Global Free List: 모든 세그먼트에서 공유하는 하나의 리스트.
- Local Free List: 각 세그먼트마다 별도로 관리되는 리스트.
ㅁ PCTFREE
- 정의: 각 블록 내에서 데이터를 저장하고 남은 공간의 비율을 설정하는 값.
- 목적:
- 데이터 수정: 데이터가 수정될 때 크기가 커지더라도 충분히 수용할 수 있도록 여유 공간을 확보.
- 성능 향상: 빈번한 데이터 수정으로 인한 블록 분할을 최소화하여 성능 저하를 방지. - 기본값: 일반적으로 10%로 설정.
ㅁ PCTUSED
- 정의: 블록을 재사용할 수 있는 기준이 되는 값.
- 목적:
- 공간 관리: 사용되지 않는 공간을 회수하여 공간을 효율적으로 활용.
- 성능 향상: 데이터 삭제 후에도 바로 공간이 회수되지 않고 PCTUSED 값 이하로 내려갈 때까지 기다렸다가
재사용하므로, 빈번한 삽입/삭제 작업에서 발생하는 블록 분할을 줄여 성능을 향상. - 기본값: 일반적으로 40%로 설정.
■ 행 마이그레이션
- 정의: 이미 저장된 행 데이터를 수정할 때, 기존 블록에 수정된 데이터를 저장할 공간이 부족하여 다른 블록으로 이동시키는 현상.
- 발생 원인:
- 데이터 수정: 기존 데이터가 수정되면서 데이터 크기가 증가할 때 발생.
- PCTFREE 부족: 블록 내에 충분한 여유 공간(PCTFREE)이 확보되지 않았을 때 발생. - 특징:
- 성능 저하: 행이 이동하면서 인덱스 정보도 업데이트되어야 하므로 추가적인 오버헤드가 발생.
- 블록 분할: 행이 이동하면서 블록이 분할 가능. - 방지 방법:
- PCTFREE 설정: 블록 내에 충분한 여유 공간을 확보하여 데이터 수정 시 충분한 공간을 확보.
- 테이블 재구성: 테이블을 재구성하여 데이터를 재정렬하고 Free Space를 확보.
■ 행 체인(Row Chaining)
- 정의: 하나의 행 데이터가 너무 커서 하나의 블록에 모두 저장되지 못하고 여러 블록에 나뉘어 저장되는 현상.
- 발생 원인:
- 큰 행 데이터: 특정 행의 데이터 크기가 블록 크기보다 클 때 발생. - 특징:
- 성능 저하: 하나의 행을 읽기 위해 여러 블록을 읽어야 하므로 I/O 작업이 증가하여 성능이 저하.
- 인덱스 활용 저하: 행의 일부만 인덱스에 포함될 수 있어 인덱스를 효율적으로 활용하기 어려움. - 방지 방법:
- 블록 크기 조정: 블록 크기를 증가시켜 큰 행 데이터를 수용할 수 있도록 함.
- 데이터 분할: 큰 행 데이터를 여러 컬럼으로 분할하여 각 컬럼을 별도의 테이블에 저장.
- PCTFREE 설정: 블록 내에 충분한 여유 공간을 확보하여 행 수정 시 충분한 공간을 확보.
※ References:
- http://www.akadia.com/services/ora_chained_rows.html
- https://support.dbagenesis.com/post/row-chaining-and-row-migration
- https://support.dbagenesis.com/post/row-chaining-and-row-migration
반응형