문서유형ㅣ기술정보
분야ㅣ모니터링/점검
문서번호ㅣTMOTI028
개요
본 문서에서는
DBMS_SPACE 패키지 중 SPACE_USAGE 쿼리를 통해 테이블 공간 사용량 분석 방법을 안내합니다.SPACE_USAGE 쿼리는 세그먼트의 High Water Mark(이하 HWM) 아래의 공간을 의미하며, 즉 현재 사용하는 공간에 대한 정보를 확인할 수 있는 쿼리입니다.방법
SPACE_USAGE 쿼리 사용 방법
SQL> set serveroutput on
declare
l_tabname varchar2(30) := '테이블명';
l_fs1_bytes number;
l_fs2_bytes number;
l_fs3_bytes number;
l_fs4_bytes number;
l_fs1_blocks number;
l_fs2_blocks number;
l_fs3_blocks number;
l_fs4_blocks number;
l_full_bytes number;
l_full_blocks number;
l_unformatted_bytes number;
l_unformatted_blocks number;
begin
dbms_space.space_usage(
segment_owner => user,
segment_name => l_tabname,
segment_type => 'TABLE',
fs1_bytes => l_fs1_bytes,
fs1_blocks => l_fs1_blocks,
fs2_bytes => l_fs2_bytes,
fs2_blocks => l_fs2_blocks,
fs3_bytes => l_fs3_bytes,
fs3_blocks => l_fs3_blocks,
fs4_bytes => l_fs4_bytes,
fs4_blocks => l_fs4_blocks,
full_bytes => l_full_bytes,
full_blocks => l_full_blocks,
unformatted_blocks => l_unformatted_blocks,
unformatted_bytes => l_unformatted_bytes
);
dbms_output.put_line('0-25% Free = '||l_fs1_blocks||' Bytes = '||l_fs1_bytes);
dbms_output.put_line('25-50% Free = '||l_fs2_blocks||' Bytes = '||l_fs2_bytes);
dbms_output.put_line('50-75% Free = '||l_fs3_blocks||' Bytes = '||l_fs3_bytes);
dbms_output.put_line('75-100% Free = '||l_fs4_blocks||' Bytes = '||l_fs4_bytes);
dbms_output.put_line('Full Blocks = '||l_full_blocks||' Bytes =
'||l_full_bytes);
dbms_output.put_line('Unformatted Blocks = '||l_unformatted_blocks||' Bytes =
'||l_unformatted_bytes);
end;
/
set serveroutput off
SPACE_USAGE 사용 후 결과 분석 예시
아래와 같이, 개발 쪽 테이블은 총 58블록을 사용하고 있고, 운용 쪽은 총49924블록을 사용하고 있습니다.
즉, 개발과 운영 환경의 데이터 건수 차이는 크지 않았으나, 블록 사용량 차이로 인해 풀스캔 수행 시간에서 큰 차이가 발생한 것을 확인할 수 있습니다.
개발 환경 결과 (sqltrace 발췌)
0-25% Free = 46 Bytes = 376832 25-50% Free = 0 Bytes = 0 50-75% Free = 1 Bytes = 8192 75-100% Free = 11 Bytes = 90112 Full Blocks = 0 Bytes = 0 Unformatted Blocks = 0 Bytes = 0 table access (full) 테이블명(40938) (et=302, cr=59, cu=4, co=26, cpu=0, ro=5000)
운영 환경 결과 (sqltrace 발췌)
0-25% Free = 32 Bytes = 262144 25-50% Free = 1 Bytes = 8192 50-75% Free = 0 Bytes = 0 75-100% Free = 49877 Bytes = 408592384 Full Blocks = 14 Bytes = 114688 Unformatted Blocks = 0 Bytes = 0 table access (full) 테이블명(40905) (et=191878, cr=49925, cu=112, co=20760, cpu=0, ro=5275)
SPACE_USAGE 분석 및 해결 방안
- 테이블을 풀스캔하는 경우, 테이블에 할당된 블록(high water mark 이전 블록)을 모두 읽어들이기 때문에 처리하는 시간에 차이가 많이 나는 것으로 보일 수 있습니다.
- 위와 같은 상황에서 간단한 해결 방법으로 데이터를 백업한 뒤 테이블을 DROP 후 재생성하는 작업이 필요합니다.