행위

로우체이닝 로우마이그레이션

DB CAFE

thumb_up 추천메뉴 바로가기


1 로우 체이닝,로우 마이그레이션 조회[편집]

  1. 인덱스의 ROWID를 이용해서 테이블을 액세스하는 경우, ROW CHAINING이나 ROW MIGRATION이 발생한 로우에 대해서는 추가적인 디스크 I/O가 발생하게 되면 db file sequential read 대기가 증가하게 됨
  2. ANALYZE 명령을 이용해 통계정보를 생성하면 DBA_TABLES 뷰의 CHAIN_CNT 칼럼에 CHAINING이나 MIGRATION이 발생한 로우 수가 기록 됨
  3. 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 로우 마이그레이션[편집]

  1. 테이블은 PCTFREE를 설정해 블록에 빈 공간을 마련해두는 이유는 UPDATE 문 수행 등으로 인해 데이터가 변경되어 로우의 크기가 커질 수 있기 때문
  2. 데이터가 블록의 빈 공간에 들어갈 수 없을정도로 커지면, ‘로우 마이그레이션’ 이 발생
  3. 로우 마이그레이션이 발생하면, 변경으로 인해 증가한 데이터 뿐만 아니라 전체 로우의 데이터가 다른 블록으로 복사된다.
  4. 해당 로우의 위치를 갖고있는 인덱스 등의 모든 오브젝트를 변경해야함
  5. 원래의 블록에는 새로 복사된 위치의 포인터를 남김
  6. 로우 마이그레이션이 발생한 로우의 데이터를 읽어오기 위해서는 ‘로우의 포인터가 저장된 블록’과 ‘로우의 데이터가 저장된 블록’을 둘 다 읽어와야한다.
  7. 해결방안은, PCTFREE 를 좀더 크게 설정하고 로우 마이그레이션의 발생을 억제하는 것

1.2 로우 체이닝[편집]

  1. 1개 로우의 데이터 크기가 블록의 데이터 저장 공간보다 클때 발생
  2. 데이터 크기가 블록의 데이터 저장공간보다 클때 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;