2011. 3. 28. 16:59

 /*+ append */  옵션이 HWM 위로 입력되는 증거

1.  High Water Mark 확인하는 스크립트 생성 아래 프로시져입니다.

 

conn sys/ocp as sysdba

set serveroutput on

 

-- show_space 사용자가 dba가 아닌 유저일 경우
-- grant select on dba_tablespaces to username;
-- grant select on dba_segments to  username;

 

SQL>CREATE OR REPLACE
PROCEDURE show_space
( p_segname IN VARCHAR2,
  p_owner   IN VARCHAR2 DEFAULT user,
  p_type    IN VARCHAR2 DEFAULT 'TABLE' )
AS
  l_free_blks                 NUMBER;
  l_total_blocks              NUMBER;
  l_total_bytes               NUMBER;
  l_unused_blocks             NUMBER;
  l_unused_bytes              NUMBER;
  l_last_used_ext_file_id     NUMBER;
  l_last_used_ext_block_id    NUMBER;
  l_last_used_block           NUMBER;
  v_SEGMENT_SPACE_MANAGEMENT  varchar2(10);
  l_partition_name     VARCHAR2(30);
  l_unformatted_blocks NUMBER;
  l_unformatted_bytes  NUMBER;
  l_fs1_blocks         NUMBER;
  l_fs1_bytes          NUMBER;
  l_fs2_blocks         NUMBER;
  l_fs2_bytes          NUMBER;
  l_fs3_blocks         NUMBER;
  l_fs3_bytes          NUMBER;
  l_fs4_blocks         NUMBER;
  l_fs4_bytes          NUMBER;
  l_full_blocks        NUMBER;
  l_full_bytes         NUMBER;
  
  PROCEDURE p( p_label IN VARCHAR2, p_num IN NUMBER )
  IS
  BEGIN
     DBMS_OUTPUT.PUT_LINE( RPAD(p_label,40,'.') || p_num );
  END;
 
BEGIN

  select SEGMENT_SPACE_MANAGEMENT into v_SEGMENT_SPACE_MANAGEMENT
  from dba_tablespaces
  where TABLESPACE_NAME = (select TABLESPACE_NAME
                           from dba_segments
                           where OWNER = p_OWNER
                           and   SEGMENT_NAME = p_segname
                           and   SEGMENT_TYPE = p_type);

  dbms_output.put_line(v_SEGMENT_SPACE_MANAGEMENT);

  if v_SEGMENT_SPACE_MANAGEMENT = 'MANUAL' then

    DBMS_SPACE.FREE_BLOCKS (
    segment_owner     => p_owner,
    segment_name      => p_segname,
    segment_type      => p_type,
    freelist_group_id => 0,
    free_blks         => l_free_blks );

    DBMS_SPACE.UNUSED_SPACE (
    segment_owner             => p_owner,
    segment_name              => p_segname,
    segment_type              => p_type,
    total_blocks              => l_total_blocks,
    total_bytes               => l_total_bytes,
    unused_blocks             => l_unused_blocks,
    unused_bytes              => l_unused_bytes,
    last_used_extent_file_id  => l_last_used_ext_file_id,
    last_used_extent_block_id => l_last_used_ext_block_id,
    last_used_block           => l_last_used_block );

    p( 'Free Blocks', l_free_blks );
    p( 'Total Blocks', l_total_blocks );
    p( 'Total Bytes', l_total_bytes );
    p( 'Unused Blocks', l_unused_blocks );
    p( 'Unused Bytes', l_unused_bytes );
    p( 'Last Used Ext FileId', l_last_used_ext_file_id );
    p( 'Last Used Ext BlockId', l_last_used_ext_block_id );
    p( 'Last Used Block', l_LAST_USED_BLOCK );

 else

    DBMS_SPACE.SPACE_USAGE(
    segment_owner      => p_owner,
    segment_name       => p_segname,
    segment_type       => p_type,
    partition_name     => l_partition_name ,
    unformatted_blocks => l_unformatted_blocks,
    unformatted_bytes  => l_unformatted_bytes,
    fs1_blocks         => l_fs1_blocks,
    fs1_bytes          => l_fs1_bytes ,
    fs2_blocks         => l_fs2_blocks ,
    fs2_bytes          => l_fs2_bytes ,
    fs3_blocks         => l_fs3_blocks,
    fs3_bytes          => l_fs3_bytes,
    fs4_blocks         => l_fs4_blocks,
    fs4_bytes          => l_fs4_bytes ,
    full_blocks        => l_full_blocks ,
    full_bytes         => l_full_bytes);

    p( 'unformatted_blocks',  l_unformatted_blocks);
    p( 'unformatted_bytes',   l_unformatted_bytes);
    p( 'fs1_blocks : 0 to 25% free space'   , l_fs1_blocks);
    p( 'fs1_bytes  : 0 to 25% free space'   , l_fs1_bytes );
    p( 'fs2_blocks : 25 to 50% free space'  , l_fs2_blocks );
    p( 'fs2_bytes  : 25 to 50% free space'  , l_fs2_bytes );
    p( 'fs3_blocks : 50 to 75% free space'  , l_fs3_blocks );
    p( 'fs3_bytes  : 50 to 75% free space'  , l_fs3_bytes);
    p( 'fs4_blocks : 75 to 100% free space' , l_fs4_blocks);
    p( 'fs4_bytes  : 75 to 100% free space' , l_fs4_bytes );
    p( 'full_blocks'                        , l_full_blocks );
    p( 'full_bytes'                         , l_full_bytes);

  end if;
END;
/

 

프로시저가 생성되었습니다.

 

2. 복사 해 넣을 copy_emp table을 만듭니다.

 

create  table  copy_emp

  as  

      select *  from emp;

 

 

3. 테이블을 분석합니다.

 

SQL> analyze table emp compute statistics;

테이블이 분석되었습니다.

 

 

4. 프로시저를 실행합니다.

SQL> exec show_space('EMP', 'SCOTT', 'TABLE')

PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

5. 오라클에 있는 프린트 할 수 있는 기능을  on합니다.

set serveroutput on

 

6. 그다음 프로 시저를 실행하면 결과를 볼수 있습니다.

SQL> set serveroutput on
SQL>  exec show_space('EMP');


Free Blocks.............................0
Total Blocks............................2
Total Bytes.............................1638
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................1
Last Used Ext BlockId...................1689
Last Used Block.........................2

 

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL>

*** Total Blocks - Unused Blocks = H.W.M 위치입니다.

 

 

7. Data를 입력하고 H.W.M 를 확인하면

SQL>
SQL> insert  into emp
  2  select * from emp;

14 개의 행이 만들어졌습니다.

SQL> /

28 개의 행이 만들어졌습니다.

SQL> /

56 개의 행이 만들어졌습니다.

SQL> /

112 개의 행이 만들어졌습니다.

SQL> /

224 개의 행이 만들어졌습니다.

SQL> /

448 개의 행이 만들어졌습니다.

SQL> /

896 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

 

SQL> analyze table emp compute statistics;

테이블이 분석되었습니다.

SQL> exec show_space('EMP');
Free Blocks.............................5
Total Blocks............................22
Total Bytes.............................180224
Unused Blocks...........................5
Unused Bytes............................40960
Last Used Ext FileId....................1
Last Used Ext BlockId...................16935
Last Used Block.........................5

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL>

 

Total Blocks -  Unused Blocks = 17      H.W.M 의 위치.

 

 

H.W.M 의에 입력되는 증거

===============================1 단계 ================================

SQL> insert /*+ append */  into emp
  2    select * from copy_emp;

14 개의 행이 만들어졌습니다.

 

SQL>  analyze table emp compute statistics;

테이블이 분석되었습니다.

 

SQL>   exec show_space('EMP');
Free Blocks.............................2
Total Blocks............................48
Total Bytes.............................393216
Unused Blocks...........................2
Unused Bytes............................16384
Last Used Ext FileId....................1
Last Used Ext BlockId...................51129
Last Used Block.........................6

PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

===============================2 단계 ================================

SQL>  insert /*+ append */  into emp
  2     select * from copy_emp;

14 개의 행이 만들어졌습니다.

 

SQL> analyze table emp compute statistics;

테이블이 분석되었습니다.

 

SQL>   exec show_space('EMP');
Free Blocks.............................2
Total Blocks............................48
Total Bytes.............................393216
Unused Blocks...........................1   -->  HWM 위로 입력되고있음
Unused Bytes............................8192
Last Used Ext FileId....................1
Last Used Ext BlockId...................51129
Last Used Block.........................7

PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

===============================3 단계 ================================

SQL>  insert /*+ append */  into emp
  2     select * from copy_emp;

14 개의 행이 만들어졌습니다.

 

SQL>  analyze table emp compute statistics;

테이블이 분석되었습니다.

 

SQL>  exec show_space('EMP');
Free Blocks.............................2
Total Blocks............................48
Total Bytes.............................393216
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................1
Last Used Ext BlockId...................51129
Last Used Block.........................8

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL>

 

----  이번에는 힌트 안쓰고 입력한다.

 

 

SQL> insert into emp
  2   select * from copy_emp;

14 개의 행이 만들어졌습니다.

 

SQL>  analyze table emp compute statistics;

테이블이 분석되었습니다.

 

SQL>  exec show_space('EMP');
Free Blocks.............................2
Total Blocks............................48
Total Bytes.............................393216
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................1
Last Used Ext BlockId...................51129
Last Used Block.........................8

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> insert into emp
  2   select * from copy_emp;

14 개의 행이 만들어졌습니다.

SQL> /

14 개의 행이 만들어졌습니다.

SQL> /  -- 10번 이상 수행

 

SQL> analyze table emp compute statistics;

테이블이 분석되었습니다.

 

SQL> exec show_space('EMP');
Free Blocks.............................1    -- HWM 는 그대로이고 HWM 아래 free block 이 채워짐
Total Blocks............................48
Total Bytes.............................393216
Unused Blocks...........................0
Unused Bytes............................0
Last Used Ext FileId....................1
Last Used Ext BlockId...................51129
Last Used Block.........................8

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL>

 

 

 

 

 

 

 

 

 

 

===========================================================

  Direct Commit 하고 나서~

  Commit 하고 나서 가능하다는.. 수정 , 셀렉트 안됨

===========================================================

SQL> truncate table emp;

        테이블이 잘렸습니다.

 

SQL> insert /*+ append */ into emp
  2  nologging
  3  select * from copy_emp;

14 개의 행이 만들어졌습니다.

 

SQL> select * from emp;
select * from emp
              *
1행에 오류:
ORA-12838: 병렬로 수정한 후 객체를 읽거나 수정할 수 없습니다r


SQL> commit;

커밋이 완료되었습니다.

SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 82/12/09       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7876 ADAMS      CLERK           7788 83/01/12       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

14 개의 행이 선택되었습니다.







 

'Oracle > Study' 카테고리의 다른 글

expdp/impdp  (0) 2011.03.28
SQL*Loader Case Studies  (0) 2011.03.28
1z0-043 덤프 공부하면서..  (0) 2011.03.14
Log file switch completion  (0) 2011.03.02
SQL 간단한 TEST  (0) 2011.02.25
Posted by 나른한스누피