본문 바로가기

빅데이터과정/WORKSHOP 2

#31_140725_WSHOP2_DB REORG

728x90

# DB REORG








row chaining 현상
하나의 row의 길이가 너무 길어서 다른 블럭에 걸쳐서 입력한 현상
대용량의 row를 채우고 남은 부분을 다른 블록에 채우게 되서 느려지는 원인이 된다



HWM
-HWM은 여유공간을 남기기 위해 설정하는 경계선
HWM을 사용하는 이유는 만약에 HWM을 설정하지 않으면 빈공간보다 큰 사이즈가 들어오면 다른 테이블 스패이스로 옮겨서 저장하는 현상이 발생하는데 이것을 row migration 현상이라고 한다이 현상을 방지하기 위해서 사용한다





- delete를 해도 HWM은 변화없음
- delete 이후 데이터가 없을 때 count 명령어를 날리면 fulll scan HWM까지 하기 떄문에 오랜 시간이 걸린다








  • DB REORG



DB Reorg 작업 이란?
1.     row migration 현상, row chaining 현상을 해결하는 것
2.     HWM(High Water Mark)를 아래로 내리는 작업




Reorg를 수행할 떄 주의할 점


move를 할 때 index가 지정되어 있으면 move 시킨 이후에도 index는 예전 테이블 스패이스를 가리키고 있기 때문에 오류가 발생한다
아래의 수행결과를 통해 그 오류를 확인할 수 있다


1.     SQL> connect scott/tiger

2.     SQL> drop index emp_sal;

3.     SQL> create index emp_sal on emp(sal);

4.     SQL> select table_name, tablespace_name
    from user_tables
    where table_name='EMP';
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
EMP                            USERS


5.     SQL> alter table emp move tablespace example;

6.     SQL> select /*+ index(emp emp_sal) */ ename, sal from emp where sal=3000;
ORA-01502: index 'SCOTT.EMP_SAL' or partition of such index is in unusable state
오류 발생하는데 아직 인덱스가 users tablespace를 가리키고 있기 떄문이다
rebuild를 통해 해결 가능

7.     SQL> select /*+ full(emp) */ ename, sal from emp where sal=3000;
emp 테이블을 full table scan 하라는 뜻
인덱스를 사용하지 않기 때문에 정상적으로 조회가 가능하다


move 때문에 발생하는 오류를 해결하기 위해서 rebuild 수행
SQL> alter index emp_sal rebuild online;
online을 붙여야지 rebuild를 하는 중에도 emp테이블에 대해 DML 작업이 가능해진다




10g 버전의 스타일 reorg 작업
기존의 9i 버전에서는 move를 통해 reorg를 수행하는데 이럴경우 인덱스가 지정되어 있을 때 다시 rebuild 해야하는 불편함이 있었다
하지만 10g 버전에서는 아래의 shrink를 이용함으로써 간단하게 수행할 수 있고 rebuild작업을 해줄 필요가 없게 됐다

1.     SQL> connect scott/tiger

2.     SQL> drop index emp_sal;

3.     SQL> create index emp_sal on emp(sal);

4.     SQL> alter table emp enable row movement;

5.     SQL> alter table emp shrink space compact;

6.     SQL> alter table emp shrink space;

7.     SQL> select /*+ index(emp emp_sal) */ ename, sal
from emp
where sal = 3000;