1. 확인

1-1. 최초 상태

SQL> select LF_ROWS,LF_BLKS,LF_ROWS_LEN,DEL_LF_ROWS,DEL_LF_ROWS_LEN from index_stats;

  LF_ROWS      LF_BLKS         LF_ROWS_LEN    DEL_LF_ROWS     DEL_LF_ROWS_LEN
----------  ----------         -----------    -----------     ---------------
    100000        199              1588892              0                   0

1-2. 대량 데이터 삭제 후

SQL> select LF_ROWS,LF_BLKS,LF_ROWS_LEN,DEL_LF_ROWS,DEL_LF_ROWS_LEN from index_stats;

  LF_ROWS      LF_BLKS         LF_ROWS_LEN    DEL_LF_ROWS     DEL_LF_ROWS_LEN
----------  ----------         -----------    -----------     ---------------
     75797         199             1203168           9131              143916

SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100 from index_stats;

(DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100
---------------------------------
                       11.9614218 

1-3. Reorg 수행 후

SQL> select LF_ROWS,LF_BLKS,LF_ROWS_LEN,DEL_LF_ROWS,DEL_LF_ROWS_LEN fromindex_stats;

  LF_ROWS      LF_BLKS         LF_ROWS_LEN    DEL_LF_ROWS     DEL_LF_ROWS_LEN
----------  ----------         -----------    -----------     ---------------
    66666          148             1059252              0                   0

SQL> select (del_lf_rows_len/lf_rows_len)*100 as index_usage from index_stats;

INDEX_USAGE
-----------
         0

2. 기준

  • del_lf_rows_len/lf_rows_len >20%
  • 대량 삭제가 발생했음을 의미함

3. 고려사항

  • 정기적인 통계정보 갱신이 적용되는 경우에만 신뢰성 있는 리오그 대상식별이 가능함으로 이를 전제로 한다.
  • 빈번한 입력/삭제 반복되는 테이블(예:인터페이스, tmp 데이터 저장..)인 경우 특별한 성능상의 저하현상이 발생하지 않을 경우 일반적인 리오그 수행여부 판단 기준이 적용되지 않는다.
  • 갱신이 빈번하게 발생하는 테이블은 pctfree값을 크게 만들어 체이닝 발생을 최소화 한다.

4. 관련 스크립트

SELECT NUM_ROWS
      ,BLOCKS
      ,EMPTY_BLOCKS
      ,AVG_SPACE
      ,AVG_ROW_LEN
FROM DBA_TABLES
WHERE NUM_ROWS / BLCKS < 50;
SELECT a.owner
     , a.table_name
     , a.NUM_ROWS
     , a.BLOCKS
     , a.EMPTY_BLOCKS
     , a.AVG_SPACE
     , a.AVG_ROW_LEN
     , b.bytes/1024/1024 bytes
FROM DBA_TABLES a
   , dba_segments b
WHERE a.NUM_ROWS / a.BLOCKS < 50
and a.num_rows > 0
and a.blocks > 0
and a.owner = b.owner
and b.segment_type = 'TABLE'
and a.table_name = b.segment_name
and b.bytes/1024/1024 > 500
order by 1,2;
SELECT a.owner
     , a.table_name
     , a.NUM_ROWS
     , a.BLOCKS
     , a.EMPTY_BLOCKS
     , a.AVG_SPACE
     , a.AVG_ROW_LEN
     , b.bytes/1024/1024 bytes
FROM DBA_TABLES a
   , dba_segments b
WHERE a.empty_blocks > 7000
and a.num_rows > 0
and a.blocks > 0
and a.owner = b.owner
and b.segment_type = 'TABLE'
and a.table_name = b.segment_name
and b.bytes/1024/1024 > 300
order by 1,2;