'shrink'에 해당되는 글 4건

  1. 2014.08.15 SEGMENT SHRINK 관련 10G 신규 기능
  2. 2013.06.03 shrink 대상 선정 및 shrink작업 1
  3. 2009.11.06 Index Coalesce VS. Shrink
  4. 2009.10.09 oracle shrink
ORACLE/ADMIN2014. 8. 15. 13:09
반응형
출처 :https://community.oracle.com/message/1701073#1701073

제품 : ORACLE SERVER

작성날짜 : 2004-11-30


SEGMENT SHRINK 관련 10G 신규 기능
===========================



PURPOSE
-------
Oracle10g에서는, 세그먼트를 shrink 시킬 옵션이 존재하며, 이 기능을 활용하면 DBA가가 공간을 좀더 효율적으로 활용할 수
있다 이 기능은, 또한 질의 처리 속도 개선에도 도움이 된다. 


Explanation
-----------
1. 준비 사항

Init.ora 파라미터인 'Compatible' 값이 10.0 이상이어야 함.
세그머트는, AUTO Segment Space Managed Tablespace에 존재해야 함.

2. 동작 방법

1) 테이블의 row movement 기능을 활성화 시킨다.
SQL> ALTER TABLE scott.emp ENABLE ROW MOVEMENT;

2) 테이블을 shrink 시키지만, HWM (High Water Mark)을 shrink 시키지 않는다.
SQL> ALTER TABLE scott.emp SHRINK SPACE COMPACT;

3) 테이블과 HWM을 shrink 시킨다.
SQL> ALTER TABLE scott.emp SHRINK SPACE;

4) 테이블 및 관련된 인덱스를 모두 shrink시킨다.
SQL> ALTER TABLE scott.emp SHRINK SPACE CASCADE;

5) MView 형태의 테이블을 shrink시킨다.
SQL> ALTER TABLE <table name> SHRINK SPACE;

6) 인덱스만 shrink 시킨다.
SQL> ALTER INDEX <index nam> SHRINK SPACE;


3. 적용 대상

1) Normal Table
2) Index
3) Lob
4) IOT
5) MView


4. Query/DML Concurrency

Segment shrink를 할 때의 online 처리는, DML-호환 락을 사용한다. 따라서 DML은
shrink를 처리 하는동안에도 사용할 수 있다. space-release/HWM 조정을 하는 단계에서는,
테이블에 대해 DML고 호환되지 않는 락을 사용한다 따라서, DML은 shink가 끝날 때 까지
잠시 중단되나.

shrink를 실행함으로써 발생하는 DML 처리 관련 에러는 없다.

쿼리는 세그먼트의 HWM에 대한 캐쉬를 사용한다. 오라클은, HWM이 언제나 커질 것으로 간주한다. 따라서
CR은 세그먼트 헤더 및 익스텐트 맵 블럭에 대해서는 필요하지 않다. 세그먼트 HWM이 작아지는 유일한
경우는, drop 또는 truncate 작업 뿐이다.

오라클은, drop/truncate DDL와 질의처리가 동시에 존재할 수있게 허용하는데, 이것은 질의 처리가
락을 필요로 하지 않기 때문이다. 만약 drop/truncate 작업이 끝난 후라면, 해당 공간은 다른 세그먼트에
의해 사용되며, 질의는 "8103 - object does not exist"라는 에러 메시지와 함께 실패하게 된다.

세그먼트를 shrink하는 동안, 세그먼트의 HWM가 변경된다면, 해당 세그먼트와 관련된 비트맵 블럭과 
세그먼트 헤더의 incarnation number가 변경된다. 후속 데이터 블럭 관련 작업은 새로 부여된
incarnation number를 사용한다.

만약 이 단계에서 실행되는 질의가 있었다면, "10632 - invalid rowid" 에러와 함께 실패하는데
다음과 같은 조건이 만족 되어야 한다.

1) 갱신된 비트맵 블럭을 읽는다 (새로운 inc#). 이 경우 failure는, 해당 공간이 재 사용되지 않았다면
발생하게 된다.

2) 공간이 동일한 객체 또는 다른 객체에 의해 재 활용 되었다.


5. Online Segment Shrink와 관련된 제약사항

ASSM의 세그먼트는 shrink 가능하다. 그러나, ASSM 테이블스페이스에 위치하는 객체
가운데 다음과 같은 객체에는 제약사항이 따른다 :

1) 클러스터에 속하는 테이블
2) long 컬럼을 포함한 테이블
3) on-commit materialized view와 연관된 테이블
4) rowid based materialized view와 연관된 테이블
5) Lob index


6. Shrink 수행시 의존 관계 관리와 제약사항 

세그먼트를 shrink 하는동안, 고려되는 유일한 의존 관계는, 테이블 - 인덱스간 관계이다.
인덱스는, shrink 후에도 unusable 상태로 남지 않는다.

세그먼트 shink를 과정에서 압축 (compaction)단계는 insert/delete 작업을 쌍으로 처리하여
이루어진다. DML trigger는 데이터를 이동하는 단계에서는 호출되지 않는다. 데이터의 내용이
변경되는 것이 아니므로, trigger가 호출 될 필요가 없다.

ROWID에 기반을 둔 trigger는, shrink를 하기 전 disable 시켜야 하는데 이것은 shink 하는동안
트리거가 호출 되지 않도록 하기 위해서이다.

on-commit materialized view와 연관된 세그먼트는 shrink 시킬 수 없다.
Primary key를 기반으로 한 materialized view는, shrink를 시킨 이후에 refresh 또는 rebuild
할 필요가 없다.

하지만, rowid에 기반을 둔 materialized view에 대해서는 refresh 또는 rebuild를 수행해 주어야
한다.


7. 가용성

세그먼트 shrink는, 온라인중에 수행될 수 있다. 따라서, 객체에 대한 가용성이 향상 되었다.
DML 작업은 세그먼트 shrink 중에도 수행 가능하나, parallel DML을 수행될 수 없다.

세그먼트를 shrink 시키는동안 데이터는 압축(compaction) 단계에서 이동이된다. 압축 단계가 진행되는
동안 개별 row 또는 데이터 블럭에 대한 lock이 사용된다.
이 상황은, lock을 이용해, update나 delete와 같은 concurrent DML이 수행되는 상황과 유사하다.
압축은, 작은 트랜잭션 다뉘로 수행되므로, 객체에 대한 가용성은 심각하게 영향을 받지 않는다.

하지만, 세그먼트를 shrink 시키는 특정 단계에서는 (HWM을 조정하는 단계), 세그먼트는, exclusive 모드로
lock이 걸린다.
이 단계는 매우 짧은 기간이며, 객체에 대한 가용성에 미치는 영향이 최소호 된다.


8. 보안

세그먼트 shrink를 수행하기 위해서는 객체에 대해서 ALTER 시키는 권한과 동등한 권한이 필요하다.


9. 상세 예제

SQL> set serveroutput on
SQL> declare
2 v_unformatted_blocks number;
3 v_unformatted_bytes number;
4 v_fs1_blocks number;
5 v_fs1_bytes number;
6 v_fs2_blocks number;
7 v_fs2_bytes number;
8 v_fs3_blocks number;
9 v_fs3_bytes number;
10 v_fs4_blocks number;
11 v_fs4_bytes number;
12 v_full_blocks number;
13 v_full_bytes number;
14 begin
15 dbms_space.space_usage ('SYSTEM', 'T_SHRINK', 'TABLE', v_unformatted_blocks,
16 v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
17 v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
18 dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
19 dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);
20 dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);
21 dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);
22 dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);
23 dbms_output.put_line('Full Blocks = '||v_full_blocks);
24 end;
25 /
Unformatted Blocks = 0
FS1 Blocks = 0
FS2 Blocks = 1
FS3 Blocks = 1
FS4 Blocks = 3
Full Blocks = 0

PL/SQL procedure successfully completed.

SQL> alter table t_shrink shrink space compact;
alter table t_shrink shrink space compact
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled

SQL> ALTER TABLE t_shrink ENABLE ROW MOVEMENT;
Table altered.

SQL> ALTER TABLE t_shrink SHRINK SPACE COMPACT;
Table altered.

SQL> set serveroutput on
SQL> declare
2 v_unformatted_blocks number;
3 v_unformatted_bytes number;
4 v_fs1_blocks number;
5 v_fs1_bytes number;
6 v_fs2_blocks number;
7 v_fs2_bytes number;
8 v_fs3_blocks number;
9 v_fs3_bytes number;
10 v_fs4_blocks number;
11 v_fs4_bytes number;
12 v_full_blocks number;
13 v_full_bytes number;
14 begin
15 dbms_space.space_usage ('SYSTEM', 'T_SHRINK', 'TABLE', v_unformatted_blocks,
16 v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
17 v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
18 dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
19 dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);
20 dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);
21 dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);
22 dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);
23 dbms_output.put_line('Full Blocks = '||v_full_blocks);
24 end;
25 /
Unformatted Blocks = 0
FS1 Blocks = 0
FS2 Blocks = 0
FS3 Blocks = 0
FS4 Blocks = 2
Full Blocks = 1

PL/SQL procedure successfully completed.

SQL> ALTER TABLE t_shrink SHRINK SPACE;
Table altered.

SQL> declare
2 v_unformatted_blocks number;
3 v_unformatted_bytes number;
4 v_fs1_blocks number;
5 v_fs1_bytes number;
6 v_fs2_blocks number;
7 v_fs2_bytes number;
8 v_fs3_blocks number;
9 v_fs3_bytes number;
10 v_fs4_blocks number;
11 v_fs4_bytes number;
v_full_blocks number;
13 v_full_bytes number;
14 begin
15 dbms_space.space_usage ('SYSTEM', 'T_SHRINK', 'TABLE', v_unformatted_blocks,
16 v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks, v_fs2_bytes,
17 v_fs3_blocks, v_fs3_bytes, v_fs4_blocks, v_fs4_bytes, v_full_blocks, v_full_bytes);
18 dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);
19 dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);
20 dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);
21 dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);
22 dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);
23 dbms_output.put_line('Full Blocks = '||v_full_blocks);
24 end;
25 /
Unformatted Blocks = 0
FS1 Blocks = 0
FS2 Blocks = 0
FS3 Blocks = 0
FS4 Blocks = 1
Full Blocks = 1

PL/SQL procedure successfully completed.



Example
-------


Reference Documents
-------------------
<Note:242090.1>


    반응형
    Posted by [PineTree]
    ORACLE/ADMIN2013. 6. 3. 17:09
    반응형

    SHRINK SPACE는 오라클10g부터 지원하는 기능으로,

    세그먼트의 데이터 조각모음(ONLINE Reorg. 효과) 기능.

     

    -----------------------------------------------------

    1. SHRINK 작업을 수행하기 위한 주요 환경 및 주의할 점
    -----------------------------------------------------

       1) 오라클 10g 이상(Init.ora parameter 'Compatible' must be >=10.0)
       2) 세그먼트 관리방식이 반드시 ASSM(Auto Segment Space Managed) Tablespace이어야 함
       3) 약 20여건씩 INSERT/DELETE하고 COMMIT하는 방식으로 SHRINK함
       4) 개별 ROW 또는 데이터 BLOCK에 대한 LOCK(ENQUEUE)이 사용
       5) FBI(Function-Based Index)를 SHRINK하는 경우
          오류 발생하므로 FBI를 DROP한 다음 작업하고
          SHRINK작업이 완료된 후 다시 생성
       6) DML TRIGGER를 발생시키지 않음(ROWID based TRIGGER는 작업 전에 DISABLED 필요)
       7) DML 작업은 세그먼트 SHRINK 중 수행 가능하나, parallel DML을 수행될 수 없음 
       8) 세그먼트를 SHRINK 시키는 특정 단계(HWM을 조정하는 단계)에서 세그먼트에

          exclusive 모드로 짧은 시간동안 LOCK(TM)이 걸림

     

    -----------------------------------------------------

    2. SHRINK 작업 방법 (순서 1]~6])
    -----------------------------------------------------

       1] SHRINK 대상 테이블 분석 및 조회
          (NUM_ROWS에 비해 사용하는 BLOCKS가 과다하면 SHRINK필요)
          SQL> connect / as sysdba

          SQL> EXECUTE DBMS_UTILITY.ANALYZE_SCHEMA('소유자', 'COMPUTE');

          SQL> SELECT OWNER,     TABLE_NAME,   NUM_ROWS,
                      BLOCKS,    EMPTY_BLOCKS, AVG_SPACE,
                      CHAIN_CNT, AVG_ROW_LEN
                 FROM DBA_TABLES
                WHERE OWNER = '소유자'
                  AND EMPTY_BLOCKS / (BLOCKS + EMPTY_BLOCKS) < 0.1
                  AND (BLOCKS + EMPTY_BLOCKS) > 0
                ORDER BY BLOCKS DESC;

     

          [참고] DBMS_SPACE.VERIFY_SHRINK_CANDIDATE

     

       2] 대상 테이블 및 관련 인덱스 NOLOGGING 설정

          SQL> connect 소유자/암호
          SQL> ALTER TABLE 테이블명 NOLOGGING;
          SQL> ALTER INDEX 인덱스명 NOLOGGING;

     

       3] 대상 테이블의 ROW MOVEMENT 기능 활성화
          (데이터의 조각모음으로 ROWID가 변경되므로 ENABLE ROW MOVEMENT)
          SQL> ALTER TABLE 테이블명 ENABLE ROW MOVEMENT;

     

       4] 필요한 작업을 선택적으로 작업
          4-1) 테이블만 SHRINK하고 HWM(High Water Mark)는 SHRINK하지 않음
               SQL> ALTER TABLE 테이블명 SHRINK SPACE COMPACT;

     

          4-2) 테이블과 HWM(High Water Mark)를 SHRINK
               (HWM SHRINK 시 TM 락 발생)
               SQL> ALTER TABLE 테이블명 SHRINK SPACE;

     

          4-3) 테이블과 테이블의 HWM을 SHRINK
               SQL> ALTER TABLE 테이블명 SHRINK SPACE COMPACT;
               SQL> ALTER TABLE 테이블명 SHRINK SPACE;

     

          4-4) 인덱스와 인덱스의 HWM을 SHRINK
               (ROWID가 변경되지 않으므로 ENABLE ROW MOVEMENT 불필요)
               SQL> ALTER INDEX 인덱스명 SHRINK SPACE COMPACT;
               SQL> ALTER INDEX 인덱스명 SHRINK SPACE;

     

          4-5) 테이블 및 관련된 인덱스를 모두 SHRINK
               SQL> ALTER TABLE 테이블명 SHRINK SPACE CASCADE COMPACT;
               SQL> ALTER TABLE 테이블명 SHRINK SPACE CASCADE;

     

       5] Row movement 비활성화
          SQL> ALTER TABLE 테이블명 DISABLE ROW MOVEMENT;

     

       6] 대상 테이블 및 관련 인덱스 LOGGING 설정
          SQL> ALTER TABLE 테이블명 LOGGING;
          SQL> ALTER INDEX 인덱스명 LOGGING;

     

       ※ M-View 형태의 테이블을 SHRINK
          on-commit materialized view와 연관된 세그먼트는 SHRINK 시킬 수 없음
          rowid에 기반을 둔 materialized view에 대해서는 refresh 또는 rebuild를 수행 필요
          SQL> ALTER TABLE M-View명 SHRINK SPACE COMPACT;
          SQL> ALTER TABLE M-View명 SHRINK SPACE;


     

    1) Chaining이 있는 테이블 select

     

    select owner, table_name, num_rows, blocks, empty_blocks, chain_cnt,
    to_char(100*(chain_cnt/num_rows),'999')||'%' as chain_pct from dba_tables
    where owner not in ('SYS','SYSTEM','TRACESVR','DBSNMP','SCOTT')
      and num_rows !=0 and chain_cnt !=0;

     

     

    반응형

    'ORACLE > ADMIN' 카테고리의 다른 글

    [ORACLE]Listener.log 관리  (0) 2013.08.06
    psu 패치  (0) 2013.07.25
    (10gR2)Full UNDO tablespace_언두 메커니즘  (0) 2013.05.19
    10g SYSAUX tablespace 크기 줄이기  (0) 2013.03.04
    Sizing Redo Log Files  (0) 2012.10.12
    Posted by [PineTree]
    ORACLE/ADMIN2009. 11. 6. 13:57
    반응형
    delete from t1 where c1 = 'GRACE';

    이와 같은 방식으로 random으로 많은 양의 데이터가 삭제될 경우,
    인덱스의 leaf block이 드문드문하게 채워져 있게 된다. (Index Fragmentaion)

    물론, 장기적으로는 삭제된 공간은 재활용 될 수 있지만
    인덱스는 sorting 되어야 한다는 특징에 의하여
    Key 값이 들어갈 수 있는 자리가 정해져 있으므로 삭제된 공간을 재활용하지 못할 수 있다.

    [Oracle Virus] - 왜 Index가 불필요하게 커지는가? 를 참조하면, 위 내용을 이해할 수 있다.

    이 경우,

    INDEX OFFLINE REBUILD
    INDEX ONLINE REBUILD
    INDEX SHRINK
    INDEX COALESCE
    를 통해 fragmentation 된 leaf 블록들을 정리한다.

    이중, coalesce와 shrink는 Oracle 10g부터 동일한 방법(delete + insert)으로 수행되고,
    Leaf block 간의 key 값을 compact 하는 것이므로 index의 높이에는 변화가 없다.

    단, coalesce는 compact를 통해 확보된 index의 Free block들을 반환하지 않으므로,
    Index의 fragmentation을 정리하지만 Index의 크기는 변하지 않는다. 

    반면, Shrink는 compact를 통해 확보된 index의 Free Block들을 반환하고 HWM를 조정하므로
    Index의 Fragmentation을 정리함과 동시에 Index의 크기를 줄인다.

    # Coalesce TEST
     

    -- Create Table
    drop table t1 purge;

    create table t1(c1 number, c2 varchar(10));

    insert into t1
    select level, 'GRACE'
    from dual
    connect by level <= 10000;

    commit;

    -- Create index on C1 column
    create index t1_idx on t1(c1);

    -- See Index Structure
    analyze index t1_idx validate structure;

    select height, blocks, lf_blks, br_blks, btree_space, pct_used
    from index_stats;

    -- t1_idx 는 총 32블록으로 이루어져 있으며, 21개 leaf block에
    -- 176,032Byte의 공간을 사용하고 있다.

    HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
    ---------- ---------- ---------- ---------- ----------- ----------
             2         32         21          1      176032         86
     
    -- Delete 25% of rows
     
    delete t1 WHERE mod(c1,4) = 1;
     
    commit;
     
    -- View before and after value of redo size
    set serveroutput on
     
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
     
    NAME                          : redo size
    VALUE                         : 6196312
     
    -- Coalesce the index
     
    alter index t1_idx coalesce;
     
    -- View before and after value of redo size
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
     
    NAME                          : redo size
    VALUE                         : 6543908

    --Coalesce 를 통해 347,596Bytes의 Redo가 발생하였다.

     
    -- See Index Structure
    analyze index t1_idx validate structure;
     
    select height, blocks, lf_blks, br_blks, btree_space, pct_used
    from index_stats;
     
    -- coalesce 후에도 t1_idx 는 총 32블록으로 이루어짐은 변화가 없고
    -- leaf block의 수가 21-> 16개로 변화하였다.
    -- 136,032 Byte의 공간을 사용하고 있다.
     
    HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
    ---------- ---------- ---------- ---------- ----------- ----------
             2         32         16          1      136032         83

    # Shrink TEST 

    -- Create Table
    drop table t1 purge;
     
    create table t1(c1 number, c2 varchar(10));
     
    insert into t1
    select level, 'GRACE'
    from dual
    connect by level <= 10000;
     
    commit;
     
    -- Create index on C1 column
    create index t1_idx on t1(c1);
     
    -- See Index Structure
    analyze index t1_idx validate structure;
     
    select height, blocks, lf_blks, br_blks, btree_space, pct_used
    from index_stats;
     
    -- t1_idx 는 총 32블록으로 이루어져 있으며, 21개 leaf block에
    -- 176,032Byte의 공간을 사용하고 있다.

    HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
    ---------- ---------- ---------- ---------- ----------- ----------
             2         32         21          1      176032         86
     
    -- Delete 25% of rows
     
    delete t1 WHERE mod(c1,4) = 1;
     
    commit;
     
    -- View before and after value of redo size
    set serveroutput on
     
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
     
    NAME                          : redo size
    VALUE                         : 9655888
     
    alter index t1_idx shrink space compact;
     
    -- View before and after value of redo size
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
    NAME                          : redo size
    VALUE                         : 10071192
     
    -- Shrink space compact 시에 415,304 Byte의 Redo가 발생하였다.
    -- Coalesce 시 발생한 347,596Bytes보다 더 많은 양의 Redo가 발생하였다.
     
    -- See Index Structure
    analyze index t1_idx validate structure;
     
    select height, blocks, lf_blks, br_blks, btree_space, pct_used
    from index_stats;
     
    -- Shrink space compact 수행 후는 coalesce 와 같은 결과를 보인다.
    -- t1_idx 는 총 32블록으로 이루어짐은 변화가 없고
    -- leaf block의 수가 21-> 16개로 변화하였다.
    -- 136,032 Byte의 공간을 사용하고 있다.
     
    HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
    ---------- ---------- ---------- ---------- ----------- ----------
             2         32         16          1      136032         83
     
    shrink space 명령을 수행한다.
     
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
    NAME                          : redo size
    VALUE                         : 10071872
     
    -- SHRINK SPACE the index
    ALTER INDEX t1_idx SHRINK SPACE;
     
    exec print_table('-
    select n.name, s.value -
    from v$mystat s, v$statname n -
    where s.statistic# = n.statistic# -
    and n.name = ''redo size''');
     
    NAME                          : redo size
    VALUE                         : 10081736
     
    -- Shrink space 시에 9,634 Byte의 Redo가 발생하였다.
    -- Shrink space compact 후 shrink space를 수행하므로
    -- coalesce 보다는 더 많은 양의 Redo가 발생한다
     
    -- See Index Structure
    analyze index t1_idx validate structure;
     
    select height, blocks, lf_blks, br_blks, btree_space, pct_used
    from index_stats;
     
    -- Shrink space 수행 후, t1_idx 는 총 32-> 24블록으로 줄어들었다.
    -- Free Block들이 Tablespace로 반환되었음을 알 수 있다.

    HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
    ---------- ---------- ---------- ---------- ----------- ----------
             2         24         16          1      136032         83
     
    출처 : http://graceoracle.tistory.com/
    반응형
    Posted by [PineTree]
    ORACLE/ADMIN2009. 10. 9. 21:38
    반응형

    기존에는 테이블을 새로 작성(reorg)  작업을 통해

    커진 테이블 스페이스 크기를 복구 가능하였으나

    10g 부터는 shrink 기능을 이용하여 손쉽게 테이블을 줄일수 있게 되었다.

    Shrink 기능은 HWM(High Water Mark)를 줄일수 있는 기능이다.


    - 사전 확인 사항

    init.ora 파일내에 compatible = 10.2 이상인것을 확인

    ASSM (Automatic Segment Space Management) 테이블 스페이스여만 가능

    각 테이블 조회 방법은

    SELECT obj.owner
    ,obj.table_name
    ,(CASE WHEN NVL(idx.cnt, 0) < 1 THEN 'YES' ELSE 'NO' END) shrinkable
    FROM dba_tables obj,
    (SELECT table_name, COUNT(rownum) cnt
    FROM dba_indexes
    WHERE index_type LIKE 'FUN%'
    GROUP BY table_name) idx
    WHERE obj.table_name = idx.table_name(+)
    AND obj.tablespace_name = upper('&1')

    쿼리를 통해 (테이블 스페이스 명을 인자값으로)

    확인 가능하다.

    1. 테이블 검색 방법

    SELECT * FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS());

    아래와 같이 테이블의 DBA_SEGMENTS에서 볼수 있는 크기와

    축소 가능 크기가 조회된다.

    SEGMENT_OWNER SEGMENT_NAME SEGMENT_TYPE PARTITION_NAME ALLOCATED_SPACE USED_SPACE RECLAIMABLE_SPACE
    MAX_TI SMR_IF_LOG TABLE
    6761793074 5910149080 851643994
    MAX_TI SMR_IF_LOG_I01 INDEX
    478455081 420139142 58315939
    MAX_TI SMR_IF_LOG_I02 INDEX
    411921243 398204079 13717164


    2. 축소하기

    가장 먼저 행들을 이동 가능하도록 변경한다.

    위의 SMR_IF_LOG 테이블을 기준으로 설명하겠다.

    ALTER TABLE SMR_IF_LOG ENABLE ROW MOVEMENT;

    --> 반대로는 ALTER TABLE SMR_IF_LOG DISABLE ROW MOVEMENT; 이다..

    이제 SHRINK 기능을 수행할수 있으며

    다음 3가지 형태로 가능하다

    ① ALTER TABLE SMR_IF_LOG SHRINK SPACE; 
        -- SMR_IF_LOG 테이블의 공간만 TABLESPACE로 환원

    ② ALTER TABLE SMR_IF_LOG SHRINK SPACE CASCADE;
        -- 모든 관련 OBJECT까지 TABLESPACE으로 공간 환원

    ③ ALTER TABLE SMR_IF_LOG SHRINK SPACE COMPACT;
       -- 행들만 이동시킴.



    ※ SHRINK 를 적용 시킬  없는 테이블
    UNDO segments
    temporary segments
    clustered tables
    tables with a column of datatype LONG
    LOB indexes
    IOT mapping tables and IOT overflow segmnets
    tables with MVIEWS with ON COMMIT
    tables with MVIEWS which are based on ROWIDs.


    SELECT --*
           'ALTER TABLE '||SEGMENT_NAME||' ENABLE ROW MOVEMENT;   '||CHR(10)||CHR(13)||
           'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE COMPACT;  '||CHR(10)||CHR(13)||
           'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE ;         '||CHR(10)||CHR(13)||
           'ALTER TABLE '||SEGMENT_NAME||' SHRINK SPACE CASCADE;  '||CHR(10)||CHR(13)||
           'ALTER TABLE '||SEGMENT_NAME||' DISABLE ROW MOVEMENT;  '||CHR(10)||CHR(13)
      FROM USER_SEGMENTS a
     WHERE 1=1
       AND a.segment_type = 'TABLE'


    select * from table(dbms_space.asa_recommendations());

    select job_name, program_name
    from dba_scheduler_jobs
    where job_name like '%SPACE%';


    select program_name, program_action
    from dba_scheduler_programs
    where program_name = 'AUTO_SPACE_ADVISOR_PROG';
    반응형
    Posted by [PineTree]