2009년 8월 18일 화요일

Row Chaining and Migration

▣ 발생 이유 : 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;

 선택된 레코드가 없습니다. 

댓글 없음:

댓글 쓰기