Mega Code Archive

 
Categories / Oracle PLSQL / Stored Procedure Function
 

Create a stored procedure to measure a table usage

SQL> SQL> set echo on SQL> SQL> SQL> create table t ( x int, y char(1000) default 'x' ); Table created. SQL> SQL> create or replace procedure measure_usage   2  as   3      l_free_blks                 number;   4      l_total_blocks              number;   5      l_total_bytes               number;   6      l_unused_blocks             number;   7      l_unused_bytes              number;   8      l_LastUsedExtFileId         number;   9      l_LastUsedExtBlockId        number;  10      l_LAST_USED_BLOCK           number;  11      procedure get_data is  12      begin  13          dbms_space.free_blocks  14          ( segment_owner     =>  USER,  15            segment_name      => 'T',  16            segment_type      => 'TABLE',  17            FREELIST_group_id => 0,  18            free_blks         => l_free_blks );  19  20          dbms_space.unused_space  21          ( segment_owner     => USER,  22            segment_name      => 'T',  23            segment_type      => 'TABLE',  24            total_blocks      => l_total_blocks,  25            total_bytes       => l_total_bytes,  26            unused_blocks     => l_unused_blocks,  27            unused_bytes      => l_unused_bytes,  28            LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,  29            LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,  30            LAST_USED_BLOCK => l_last_used_block ) ;  31  32  33          dbms_output.put_line( L_free_blks || ' on FREELIST, ' ||  34                                to_number(l_total_blocks-l_unused_blocks-1 ) ||  35                                ' used by table' );  36      end;  37  begin  38      for i in 0 .. 10  39      loop  40          dbms_output.put( 'insert ' || to_char(i,'00') || ' ' );  41          get_data;  42          insert into t (x) values ( i );  43          commit ;  44      end loop;  45  46  47      for i in 0 .. 10  48      loop  49          dbms_output.put( 'update ' || to_char(i,'00') || ' ' );  50          get_data;  51          update t set y = null where x = i;  52          commit;  53      end loop;  54  end;  55  / Procedure created. SQL> SQL> exec measure_usage insert  00 0 on FREELIST, 0 used by table insert  01 1 on FREELIST, 1 used by table insert  02 1 on FREELIST, 1 used by table insert  03 1 on FREELIST, 1 used by table insert  04 1 on FREELIST, 1 used by table insert  05 1 on FREELIST, 1 used by table insert  06 1 on FREELIST, 1 used by table insert  07 1 on FREELIST, 1 used by table insert  08 1 on FREELIST, 2 used by table insert  09 1 on FREELIST, 2 used by table insert  10 1 on FREELIST, 2 used by table update  00 1 on FREELIST, 2 used by table update  01 1 on FREELIST, 2 used by table update  02 1 on FREELIST, 2 used by table update  03 1 on FREELIST, 2 used by table update  04 2 on FREELIST, 2 used by table update  05 2 on FREELIST, 2 used by table update  06 2 on FREELIST, 2 used by table update  07 2 on FREELIST, 2 used by table update  08 2 on FREELIST, 2 used by table update  09 2 on FREELIST, 2 used by table update  10 2 on FREELIST, 2 used by table PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table t; Table dropped. SQL> SQL> --