表のHWMを確認する

Pocket

ANALYZEによる統計情報を収集することができない環境で、パッケージDBMS_SPACEを使用して空きブロック数、使用ブロック数(ハイ・ウォータ・マーク)を調査する。

出力結果の説明:

テーブル名 :表名
パーティション名 :パーティションの場合は、パーティション名
セグメントタイプ :セグメントのタイプ(TABLE、もしくはTABLE PARTITION)
全体サイズ(KB) :表、またはパーティションが確保しているサイズ(KB)
未使用サイズ(KB) :一度も使用されたことがないサイズ(KB)
使用済サイズ(KB) :一度でも使用されたことのあるサイズ(KB)

 

prompt *************************************************************************
accept OWNER prompt ‘表の所有者を入力[リターンで全ユーザ ] >> ‘
accept TABLE_NAME prompt ‘表名を入力 [リターンで全表 ] >> ‘
prompt *************************************************************************
set lines 120
set veri off
set echo off
set feed off
set serveroutput on
exec dbms_output.enable(1000000);
spool 表HWMサイズ.lis

declare
i_OWNER varchar2(15);
p_OWNER varchar2(15);
i_TABLE_NAME varchar2(20);
TotalBlck number;
TotalByte number;
UnUsedBlck number;
UnUsedByte number;
LastUsedExtFileID number;
LastUsedExtBlckID number;
LastUsedBlk number;
v_PARTNAME varchar2(25);

LenOwner constant number :=15;
LenSegment_name constant number :=27;
LenPartition_name constant number :=22;
LenSegment_type constant number :=16;
LenByte constant number :=12;

begin
i_OWNER := upper(‘&&OWNER’);
i_TABLE_NAME := upper(‘&&TABLE_NAME’);

if i_OWNER is null or i_OWNER = ‘%’ then
p_OWNER := ‘全ユーザ’;
i_OWNER := ‘%’;
end if;
if i_TABLE_NAME is null or i_TABLE_NAME = ‘%’ then
i_TABLE_NAME := ‘%’;
end if;

dbms_output.put_line(‘■■■■ ‘||i_OWNER||’が所有している表エクステント中の実使用サイズ ■■■■’);
dbms_output.put_line(rpad(‘セグメント’ ,LenOwner)||
rpad(‘テーブル’ ,LenSegment_name)||
rpad(‘パーティション’,LenPartition_name)||
rpad(‘セグメント’ ,LenSegment_type)||
lpad(‘全体’ ,LenByte)||
lpad(‘未使用’ ,LenByte)||
lpad(‘使用済’ ,LenByte)
);
dbms_output.put_line(rpad(‘所有者’ ,LenOwner)||
rpad(‘名’,LenSegment_name)||
rpad(‘名’,LenPartition_name)||
rpad(‘タイプ’,LenSegment_type)||
lpad(‘サイズ(KB)’,LenByte)||
lpad(‘サイズ(KB)’,LenByte)||
lpad(‘サイズ(KB)’,LenByte)
);
dbms_output.put_line(rpad(‘-‘,LenOwner,’-‘)||
rpad(‘-‘,LenSegment_name,’-‘)||
rpad(‘-‘,LenPartition_name,’-‘)||
rpad(‘-‘,LenSegment_type,’-‘)||
lpad(‘-‘,LenByte,’-‘)||
lpad(‘-‘,LenByte,’-‘)||
lpad(‘-‘,LenByte,’-‘)
);

for Cur1 in (select
owner,
segment_name,
partition_name,
segment_type
from sys.dba_segments
where owner like i_OWNER
and owner not in
(‘SYS’,’SYSTEM’,’CTXSYS’,’MDSYS’,’ORDSYS’,’AURORA$JIS$UTILITY$’,’OUTLN’,’OSE$HTTP$ADMIN’)
and segment_name like i_TABLE_NAME
and segment_type in (‘TABLE’,’TABLE PARTITION’)
order by Owner,Bytes)
loop
dbms_space.unused_space(cur1.owner,cur1.segment_name,cur1.segment_type,
TotalBlck,TotalByte,UnUsedBlck,UnUsedByte,LastUsedExtFileID,LastUsedExtBlckID,
LastUsedBlk,cur1.partition_name);
if cur1.partition_name is null then
v_partname := rpad(‘ ‘,LenPartition_name,’ ‘);
else
v_partname := rpad(cur1.partition_name,LenPartition_name,’ ‘);
end if;

dbms_output.put_line(rpad(cur1.owner,LenOwner)||
rpad(cur1.segment_name,LenSegment_name)||
v_partname||
rpad(cur1.segment_type,LenSegment_type)||
lpad(TotalByte/1024,LenByte)||
lpad(UnUsedByte/1024,LenByte)||
lpad((TotalByte-UnUsedByte)/1024,LenByte)
);
end loop;
end;
/
spool off

undef OWNER
undef TABLE_NAME
set feed on

 

投稿者:

oracledba

長年Oracleエンジニアを中心として、業務に携わってきました。 このサイトが少しでもお役に立てれば幸いです。

コメントを残す