▣ 발생 이유 : PCTFREE의 부족으로 발생
▣ Migration : 이동된 row
▣ Row Chaining : 1개의 row를 읽으려고 2개의 블록을 읽게 됨
- 증상 : I/O 속도 떨어짐
- 해결법 : move(+index rebuild)
▣ Row Chaining 실습
SQL> @testSet
SQL> truncate table tm;
Table truncated.
SQL> ed testSet
SQL> exec tm_i(100000);
PL/SQL procedure successfully completed.
SQL> select sum(blocks) from user_extents
2 where segment_name='TM';
SUM(BLOCKS)
-----------
256
SQL> update tm set data='123456789012345678901234567890'; => Row Chain 발생을 위해 row의 길이 증가시킴
100000 rows updated.
SQL> select sum(blocks) from user_extents
2 where segment_name='TM';
SUM(BLOCKS)
-----------
1152 => Block이 확장되었음( Row Chain 발생 )
SQL> analyze table tm compute statistics;
Table analyzed.
SQL> select chain_cnt from user_tables
2 where table_name='TM';
CHAIN_CNT
----------
81186
SQL> alter table tm move; => move 시킴
Table altered.
SQL> analyze table tm compute statistics;
analyze table tm compute statistics
*
ERROR at line 1:
ORA-01502: index 'SCOTT.TM_PK' or partition of such index is in unusable state
SQL> alter index SCOTT.TM_PK rebuild;
Index altered.
SQL> analyze table tm compute statistics;
Table analyzed.
SQL> select chain_cnt from user_tables
2 where table_name='TM';
CHAIN_CNT
----------
0
▣ db 전체에 존재하는 chaining을 찾으시오(소유자, 테이블명, 체인갯수)
S SYS> exec dbms_stats.gather_database_stats; => 과거의 데이터일 수 있기 때문에 DB 전체 통계수집먼저 한다.
S SYS> select owner,table_name,chain_cnt from dba_tables where chain_cnt>0;
선택된 레코드가 없습니다.
댓글 없음:
댓글 쓰기