개요
본 문서에서는 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
SQL
복사
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)
SQL
복사
운영 환경 결과 (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)
SQL
복사
SPACE_USAGE 분석 및 해결 방안
•
테이블을 풀스캔하는 경우, 테이블에 할당된 블록(high water mark 이전 블록)을 모두 읽어들이기 때문에 처리하는 시간에 차이가 많이 나는 것으로 보일 수 있습니다.
•
위와 같은 상황에서 간단한 해결 방법으로 데이터를 백업한 뒤 테이블을 DROP 후 재생성하는 작업이 필요합니다.