Search notes:

Oracle: DBMS_COMPRESSION

dbms_compression estimates compression rates for Advanced Compression.
Estimate the compression rate for the 100 largest table segments:
drop   table tq84_compression_rate;

create table tq84_compression_rate (
   seg            varchar2(128),
   part           varchar2(128),
   blkcnt_cmp     integer,
   blkcnt_uncmp   integer,
   row_cmp        integer,
   row_uncmp      integer,
   cmp_ratio      number ,
   gb_orig        number,
   gb_comp        number,
   comptype_str   varchar2(1000)
);
 
set serveroutput on
declare
   i              pls_integer := 0;
   cnt            integer;
   blkcnt_cmp     pls_integer;
   blkcnt_uncmp   pls_integer;
   row_cmp        pls_integer;
   row_uncmp      pls_integer;
   cmp_ratio      number;
   comptype_str   varchar2(1000);
 
begin
 
   for r in (
      select
         seg.segment_name,
         seg.partition_name,
         seg.bytes,
         obj.object_type
      from
         user_segments  seg         join
         user_objects   obj on     seg.segment_name           =     obj.object_name            and
                               nvl(seg.partition_name, 'n/a') = nvl(obj.subobject_name, 'n/a')
      where
         obj.object_type like 'TABLE%'
      order by
              bytes desc
 
   ) loop
 
      i := i+1; exit when i >= 100;
 
   --
   -- Skip segments whose compression rate was already determined
   --
      select
         count(*) into cnt
      from
         tq84_compression_rate t
      where
            t.seg          =     r.segment_name            and
        nvl(t.part, 'n/a') = nvl(r.partition_name, 'n/a');
 
 
     if cnt > 0 then
        dbms_output.put_line('continue ' || r.segment_name || ' ' || r.partition_name);
        continue;
     end if;
 
     begin
 
        dbms_compression.get_compression_ratio (
           scratchtbsname        => 'DWH_TMP2',            -- select * from user_tablespaces
           ownname               =>  user,
           objname               =>  r.segment_name,
           subobjname            =>  r.partition_name,
           comptype              =>  dbms_compression.comp_advanced,
           blkcnt_cmp            =>  blkcnt_cmp       ,
           blkcnt_uncmp          =>  blkcnt_uncmp     ,
           row_cmp               =>  row_cmp          ,
           row_uncmp             =>  row_uncmp        ,
           cmp_ratio             =>  cmp_ratio        ,
           comptype_str          =>  comptype_str
--         subset_numrows        in     number  default comp_ratio_minrows,
--         objtype               in     pls_integer default objtype_table
         );
 
         insert into tq84_compression_rate values (
              r.segment_name,
              r.partition_name,
              blkcnt_cmp       ,
              blkcnt_uncmp     ,
              row_cmp          ,
              row_uncmp        ,
              cmp_ratio        ,
              r.bytes /1024/1024/1024,
              r.bytes /1024/1024/1024/cmp_ratio,
              comptype_str
         );
 
      exception when others then
         dbms_output.put_line(sqlerrm);
         dbms_output.put_line(r.segment_name);
         dbms_output.put_line(r.partition_name);
      end;
 
   end loop;
 
   commit;
 
end;
/
 
select * from tq84_compression_rate;

See also

Oracle DBMS PL/SQL packages

Index