본문 바로가기

oracle10R2

Row Chain 실습

=======================================================
*** Row Chain 실습
=======================================================
☞ 테이블 생성
create table chain_test
as (select * from hr.employees);

select first_name, length(first_name)
from chain_test;

☞ 통계를 수집한다.(현재 상황이 어떠한가??)
analyze table chain_test compute statistics;

☞ 현재 상태에 대한 분석
select table_name, chain_cnt from user_tables
where table_name='CHAIN_TEST';
TABLE_NAME                      CHAIN_CNT
------------------------------ ----------
CHAIN_TEST                              0

☞ 행체인 발생을 위한 업데이트 실행
update chain_test
set first_name = ‘ABCDEFGHIJKLMNOPQRS’;
107 rows updated.

☞ 통계를 수집한다.
SQL> analyze table chain_test compute statistics;

☞ chain_cnt  칼럼 : 다른 블록으로의 체인된 Row 개수 혹은 새로운 블록으로 Migrate된 개수
SQL> select table_name, chain_cnt from user_tables
   2  where table_name= ‘CHAIN_TEST';
TABLE_NAME                      CHAIN_CNT
------------------------------ ----------
CHAIN_TEST                              6

☞ CHAINED_ROWS 테이블
: LIST CHAINED ROWS 옵션은 행이전/행체인된 Row에 대하여 정보를 수집하는 옵션이다.
: ANALYZE 문장 사용시 LIST CHAINED ROWS 옵션을 동시에 사용하는 경우 그 결과 데이터가 저장되는 테이블이다.
SQL> drop table chained_rows;
Table dropped.

SQL> @?/rdbms/admin/utlchain.sql → chained_rows 테이블 생성해주는 스크립트 파일
Table created.

SQL> update chain_test
     set first_name = ‘ABCDEFGHIJKLMNOPQRST’;

SQL> commit;
Commit complete.

☞ chain_test 테이블의 분석 결과를 chained_rows 테이블에 인서트한다.
analyze table chain_test
list chained rows
into chained_rows;
Table analyzed.

SQL> desc chained_rows
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
OWNER_NAME                                         VARCHAR2(30)
TABLE_NAME                                         VARCHAR2(30)
CLUSTER_NAME                                       VARCHAR2(30)
PARTITION_NAME                                     VARCHAR2(30)
SUBPARTITION_NAME                                  VARCHAR2(30)
HEAD_ROWID                                         ROWID
ANALYZE_TIMESTAMP                                  DATE

select count(*)
from chained_rows;
  COUNT(*)
----------
         7
SQL> select table_name, head_rowid from chained_rows;
TABLE_NAME                     HEAD_ROWID
------------------------------ ------------------
CHAIN_TEST                     AAAM0iAABAAAO26AAd
CHAIN_TEST                     AAAM0iAABAAAO26ABA
CHAIN_TEST                     AAAM0iAABAAAO26ABG
CHAIN_TEST                     AAAM0iAABAAAO26ABM
CHAIN_TEST                     AAAM0iAABAAAO26ABT
CHAIN_TEST                     AAAM0iAABAAAO26ABZ
CHAIN_TEST                     AAAM0iAABAAAO26ABe
7 rows selected.

☞ chain_test 테이블과 관련된 레코드만을 가지고 새로운 테이블을 생성한다.
   이 새로운 테이블은 Row Chain이 발생한 행만을 별도로 만든 테이블이 된다.

create table new_chain
as
select *
from chain_test
where rowid in(
select head_rowid
from chained_rows
where table_name='CHAIN_TEST'
);

☞ chain_test 테이블과 관련된 레코드를 삭제한다.
delete from chain_test
where rowid in(
select head_rowid
from chained_rows
where table_name='CHAIN_TEST'
);
7 rows deleted.

☞ 통계 정보는 정적이므로 아직 반영이 안되어 있음을 알 수 있다.
SQL> select table_name, chain_cnt from user_tables
  2  where table_name= ‘CHAIN_TEST';
TABLE_NAME                      CHAIN_CNT
------------------------------ ----------
CHAIN_TEST                              6

☞ 통계 정보 수집
SQL> analyze table chain_test compute statistics;

SQL> select table_name, chain_cnt from user_tables
  2  where table_name= ‘CHAIN_TEST';
TABLE_NAME                      CHAIN_CNT
------------------------------ ----------
CHAIN_TEST                              0

========= End Of File ===================================================================

ADD1.
SQL> alter table employees move tablespace users;
 단, 해당 테이블의 인덱스가 unusalbe state로 변경되기때문에 rebuild 작업이 추가적으로 요구됨.


ADD2.
 dbms_redefinition

ADD3.
 exp > imp

'oracle10R2' 카테고리의 다른 글

buffer_cache  (0) 2011.06.20
audit  (0) 2011.06.20
Logminer  (0) 2011.06.20
Benefit ASM  (0) 2011.06.19
oracle 10g partition 적용 가이드  (0) 2011.06.18