/*+ 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 |