"로우체이닝 로우마이그레이션"의 두 판 사이의 차이
DB CAFE
(→로우 마이그레이션/체이닝이 발생한 테이블,row 확인) |
|||
(같은 사용자의 중간 판 6개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | == 로우 마이그레이션 == | + | == 로우 체이닝,로우 마이그레이션 조회 == |
− | # | + | # 인덱스의 ROWID를 이용해서 테이블을 액세스하는 경우, ROW CHAINING이나 ROW MIGRATION이 발생한 로우에 대해서는 추가적인 디스크 I/O가 발생하게 되면 db file sequential read 대기가 증가하게 됨 |
− | + | # ANALYZE 명령을 이용해 통계정보를 생성하면 DBA_TABLES 뷰의 CHAIN_CNT 칼럼에 CHAINING이나 MIGRATION이 발생한 로우 수가 기록 됨 | |
− | # | + | # SQL 문을 이용해서 현재 시스템 상에서 발생하고 있는 ROW CHAINING이나 ROW MIGRATION 발생 내역을 확인 |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | # | ||
− | |||
<source lang=sql> | <source lang=sql> | ||
25번째 줄: | 17번째 줄: | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | == 로우 마이그레이션 | + | |
+ | ===로우 마이그레이션 === | ||
+ | # 테이블은 PCTFREE를 설정해 블록에 빈 공간을 마련해두는 이유는 UPDATE 문 수행 등으로 인해 데이터가 변경되어 로우의 크기가 커질 수 있기 때문 | ||
+ | # 데이터가 블록의 빈 공간에 들어갈 수 없을정도로 커지면, ‘로우 마이그레이션’ 이 발생 | ||
+ | # 로우 마이그레이션이 발생하면, 변경으로 인해 증가한 데이터 뿐만 아니라 전체 로우의 데이터가 다른 블록으로 복사된다. | ||
+ | # 해당 로우의 위치를 갖고있는 인덱스 등의 모든 오브젝트를 변경해야함 | ||
+ | # 원래의 블록에는 새로 복사된 위치의 포인터를 남김 | ||
+ | # 로우 마이그레이션이 발생한 로우의 데이터를 읽어오기 위해서는 ‘로우의 포인터가 저장된 블록’과 ‘로우의 데이터가 저장된 블록’을 둘 다 읽어와야한다. | ||
+ | # 해결방안은, PCTFREE 를 좀더 크게 설정하고 로우 마이그레이션의 발생을 억제하는 것 | ||
+ | |||
+ | === 로우 체이닝 === | ||
+ | # 1개 로우의 데이터 크기가 블록의 데이터 저장 공간보다 클때 발생 | ||
+ | # 데이터 크기가 블록의 데이터 저장공간보다 클때 1개 로우를 여러개의 조각으로 분리하고 각 조각을 다른 블록에 저장 | ||
+ | |||
+ | |||
=== 테이블별 체이닝 발생 건수 조회 === | === 테이블별 체이닝 발생 건수 조회 === | ||
<source lang=sql> | <source lang=sql> | ||
46번째 줄: | 49번째 줄: | ||
FROM CHAINED_ROWS; | FROM CHAINED_ROWS; | ||
</source> | </source> | ||
+ | |||
+ | * CHAINED_ROWS테이블은 utlchain.sql or utlchn1.sql 스크립트를 수행해야 CHAINED_ROWS 테이블이 생성됨. (sys 유저로) | ||
+ | <source lang=sql> | ||
+ | sql>@?/rdbms/admin/utlchain.sql | ||
+ | </source> | ||
+ | |||
+ | * SYS.CHAINED_ROWS 테이블의 컬럼 설명 | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Column !! Description | ||
+ | |- | ||
+ | | OWNER_NAME || Table owner | ||
+ | |- | ||
+ | | TABLE_NAME || Table name | ||
+ | |- | ||
+ | | CLUSTER_NAME || Cluster the table is in, if any | ||
+ | |- | ||
+ | | PARTITION_NAME || The name of the partition | ||
+ | |- | ||
+ | | SUB_PARTITION_NAME || The name of the subpartition | ||
+ | |- | ||
+ | | HEAD_ROWID || ROWID the chained row is accessed by | ||
+ | |- | ||
+ | | ANALYZE_TIMESTAMP || Date/time that the ANALYZE statement was issued | ||
+ | |} | ||
[[category:oracle]] | [[category:oracle]] |
2024년 7월 19일 (금) 16:37 기준 최신판
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;
- CHAINED_ROWS테이블은 utlchain.sql or utlchn1.sql 스크립트를 수행해야 CHAINED_ROWS 테이블이 생성됨. (sys 유저로)
sql>@?/rdbms/admin/utlchain.sql
- SYS.CHAINED_ROWS 테이블의 컬럼 설명
Column | Description |
---|---|
OWNER_NAME | Table owner |
TABLE_NAME | Table name |
CLUSTER_NAME | Cluster the table is in, if any |
PARTITION_NAME | The name of the partition |
SUB_PARTITION_NAME | The name of the subpartition |
HEAD_ROWID | ROWID the chained row is accessed by |
ANALYZE_TIMESTAMP | Date/time that the ANALYZE statement was issued |