로우체이닝 로우마이그레이션
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 로우 체이닝,로우 마이그레이션 조회[편집]
- 인덱스의 ROWID를 이용해서 테이블을 액세스하는 경우, ROW CHAINING이나 ROW MIGRATION이 발생한 로우에 대해서는 추가적인 디스크 I/O가 발생하게 되면 db file sequential read 대기가 증가하게 됨
- ANALYZE 명령을 이용해 통계정보를 생성하면 DBA_TABLES 뷰의 CHAIN_CNT 칼럼에 CHAINING이나 MIGRATION이 발생한 로우 수가 기록 됨
- SQL 문을 이용해서 현재 시스템 상에서 발생하고 있는 ROW CHAINING이나 ROW MIGRATION 발생 내역을 확인
SELECT value
FROM v$sysstat
WHERE name = `table fetch continued row`;
SELECT a.sid, b.value
FROM v$session a, v$sesstat b, v$statname c
WHERE a.sid=b.sid
and b.statistic#=c.statistic#
and c.name=`table fetch continued row`;
1.1 로우 마이그레이션[편집]
- 테이블은 PCTFREE를 설정해 블록에 빈 공간을 마련해두는 이유는 UPDATE 문 수행 등으로 인해 데이터가 변경되어 로우의 크기가 커질 수 있기 때문
- 데이터가 블록의 빈 공간에 들어갈 수 없을정도로 커지면, ‘로우 마이그레이션’ 이 발생
- 로우 마이그레이션이 발생하면, 변경으로 인해 증가한 데이터 뿐만 아니라 전체 로우의 데이터가 다른 블록으로 복사된다.
- 해당 로우의 위치를 갖고있는 인덱스 등의 모든 오브젝트를 변경해야함
- 원래의 블록에는 새로 복사된 위치의 포인터를 남김
- 로우 마이그레이션이 발생한 로우의 데이터를 읽어오기 위해서는 ‘로우의 포인터가 저장된 블록’과 ‘로우의 데이터가 저장된 블록’을 둘 다 읽어와야한다.
- 해결방안은, PCTFREE 를 좀더 크게 설정하고 로우 마이그레이션의 발생을 억제하는 것
1.2 로우 체이닝[편집]
- 1개 로우의 데이터 크기가 블록의 데이터 저장 공간보다 클때 발생
- 데이터 크기가 블록의 데이터 저장공간보다 클때 1개 로우를 여러개의 조각으로 분리하고 각 조각을 다른 블록에 저장
1.3 테이블별 체이닝 발생 건수 조회[편집]
SELECT TABLE_NAME,
CHAIN_CNT
FROM USER_TABLES
WHERE TABLE_NAME = <테이블명>;
1.4 로우 마이그레이션/체이닝이 발생한 테이블,row 확인[편집]
SELECT owner_name,
table_name,
head_rowid
FROM CHAINED_ROWS;