Search notes:

DBMS_SPACE.SPACE_USAGE

dbms_space.space_usage reports space usage of data blocks below a segment's high water mark or information about securefile lob space usage.

Procedure to print space usage of segments

The following procedure prints the figures obtained from dbms_space.space usage for a given segment:
create or replace procedure space_usage(
   seg_name       varchar2           ,
   seg_type       varchar2 := 'TABLE',
   seg_owner      varchar2 :=  user  ,
   part_name      varchar2 :=  null
)
   authid definer
as
  
   unformatted_blocks      number; unformatted_bytes number;
   fs1_blocks              number; fs1_bytes         number;
   fs2_blocks              number; fs2_bytes         number;
   fs3_blocks              number; fs3_bytes         number;
   fs4_blocks              number; fs4_bytes         number;
   full_blocks             number; full_bytes        number;
  
   non_admin_blocks        number;
   cnt_blocks              number;
 
begin
   
 
   dbms_space.space_usage(
      segment_owner           => seg_owner,
      segment_name            => seg_name,
      segment_type            => seg_type,
      unformatted_blocks      => unformatted_blocks, unformatted_bytes => unformatted_bytes,
      fs1_blocks              => fs1_blocks        , fs1_bytes         => fs1_bytes        ,
      fs2_blocks              => fs2_blocks        , fs2_bytes         => fs2_bytes        ,
      fs3_blocks              => fs3_blocks        , fs3_bytes         => fs3_bytes        ,
      fs4_blocks              => fs4_blocks        , fs4_bytes         => fs4_bytes        ,
      full_blocks             => full_blocks       , full_bytes        => full_bytes       ,
      partition_name          => part_name
   );
 
   
   select blocks into cnt_blocks
   from
   --
   -- In case of ORA-00942: table or view does not exist:
   --   Replace dba_segments with user_segments and comment line with seg.owner, or
   --   grant select on dba_segments to …
   --
      dba_segments seg
   where
          seg.owner                  =     seg_owner         and
          seg.segment_name           =     seg_name          and
      nvl(seg.partition_name, 'n/a') = nvl(part_name, 'n/a') and
          seg.segment_type           =     seg_type;
 
   non_admin_blocks := full_blocks+ fs1_blocks + fs2_blocks + fs3_blocks + fs4_blocks+unformatted_blocks;
  
   dbms_output.put_line('Total blocks  :' || to_char(cnt_blocks , '999,999,990'));  
   dbms_output.put_line('     100% full:' || to_char(full_blocks, '999,999,990'));  
   dbms_output.put_line('75 - 100% full:' || to_char(fs1_blocks , '999,999,990'));
   dbms_output.put_line('50 -  75% full:' || to_char(fs2_blocks , '999,999,990'));
   dbms_output.put_line('25 -  50% full:' || to_char(fs3_blocks , '999,999,990'));
   dbms_output.put_line(' 0 -  25% full:' || to_char(fs4_blocks , '999,999,990'));
   dbms_output.put_line('unformatted   :' || to_char(unformatted_blocks , '999,999,990'));
--
-- Bitmap blocks, segment header and extent map blocks are not accounted for by dbms_space.space_usage,
-- we need to report those separately:
--
   dbms_output.put_line('Admin blocks  :' || to_char(cnt_blocks - non_admin_blocks, '999,999,990'));
   
end;
/

See also

dbms_space

Index