ITPub博客

首页 > 数字化转型 > ERP > 显示段对象的空间信息show_space (适用于9i版本)

显示段对象的空间信息show_space (适用于9i版本)

原创 ERP 作者:yaanzy 时间:2004-12-14 15:14:53 0 删除 编辑
show_space这个函数最先是Tom在《expert one-on-one》中用到的,用来查看对象的空间使用情况,但是他用的适用于8i版本,
9i有许多新特性没法用到,itpub上出了一个for 9i的版本,作者xzh2000,我做了一些改动便于自己使用[@more@]

create or replace procedure show_space
/*
   描述:本程序是针对Oracle 920以上版本的
         last updated 2004-12-14 by yaanzy
        
   注意:表的类型(ASSM、MANUAL)一定要输入准确,否则程序报错:
         ORA-10614、ORA-10618,缺省是ASSM
*/

( p_segname_1 in varchar2,
  p_space     in varchar2 default 'AUTO',
  p_type_1    in varchar2 default 'TABLE' ,
  p_owner_1   in varchar2 default user)
as
    p_segname varchar2(100);
    p_type    varchar2(10);
    p_owner   varchar2(30);

    l_unformatted_blocks    number;
    l_unformatted_bytes     number;
    l_fs1_blocks            number;
    l_fs1_bytes             number;
    l_fs2_blocks            number;
    l_fs2_bytes             number;
    l_fs3_blocks            number;
    l_fs3_bytes             number;
    l_fs4_blocks            number;
    l_fs4_bytes             number;
    l_full_blocks           number;
    l_full_bytes            number;

    l_free_blks             number;
    l_total_blocks          number;
    l_total_bytes           number;
    l_unused_blocks         number;
    l_unused_bytes          number;
    l_LastUsedExtFileId     number;
    l_LastUsedExtBlockId    number;
    l_LAST_USED_BLOCK       number;

    procedure p( p_label in varchar2, p_num in number )
    is
    begin
        dbms_output.put_line( rpad(p_label,40,'.') ||p_num );
    end;
begin
    p_segname := upper(p_segname_1); -- rainy changed
    p_owner := upper(p_owner_1);
    p_type := p_type_1;

    if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
        p_type := 'INDEX';
    end if;

    if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
        p_type := 'TABLE';
    end if;

    if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
        p_type := 'CLUSTER';
    end if;


    dbms_space.unused_space
    ( segment_owner => p_owner,
      segment_name  => p_segname,
      segment_type  => p_type,
      total_blocks  => l_total_blocks,
      total_bytes   => l_total_bytes,
      unused_blocks => l_unused_blocks,
      unused_bytes  => l_unused_bytes,
      LAST_USED_EXTENT_FILE_ID  => l_LastUsedExtFileId,
      LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
      LAST_USED_BLOCK => l_LAST_USED_BLOCK );
   
    p( 'Total Blocks', l_total_blocks );
    p( 'Total Bytes', l_total_bytes );
    p( 'Unused Blocks', l_unused_blocks );
    p( 'Unused Bytes', l_unused_bytes );
    p( 'Last Used Ext FileId', l_LastUsedExtFileId );
    p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
    p( 'Last Used Block', l_LAST_USED_BLOCK );
   
    if p_space = 'MANUAL' or p_space = 'manual' then
        dbms_space.free_blocks
        ( segment_owner => p_owner,
          segment_name => p_segname,
          segment_type => p_type,
          freelist_group_id => 0,
          free_blks => l_free_blks );

        p( 'Free Blocks', l_free_blks );
    end if;

   

    if p_space = 'auto' or p_space = 'AUTO' then
       dbms_space.space_usage
       (segment_owner => p_owner ,
        segment_name => p_segname ,
        segment_type => p_type ,
        unformatted_blocks => l_unformatted_blocks ,
        unformatted_bytes => l_unformatted_bytes,
        fs1_blocks => l_fs1_blocks,
        fs1_bytes => l_fs1_bytes ,
        fs2_blocks => l_fs2_blocks,
        fs2_bytes => l_fs2_bytes,
        fs3_blocks => l_fs3_blocks ,
        fs3_bytes => l_fs3_bytes,
        fs4_blocks => l_fs4_blocks,
        fs4_bytes => l_fs4_bytes,
        full_blocks => l_full_blocks,
        full_bytes => l_full_bytes);
       
        dbms_output.put_line(rpad(' ',50,'*'));
        dbms_output.put_line('The segment is analyzed');
        p( '0% -- 25% free space blocks', l_fs1_blocks);
        p( '0% -- 25% free space bytes', l_fs1_bytes);
        p( '25% -- 50% free space blocks', l_fs2_blocks);
        p( '25% -- 50% free space bytes', l_fs2_bytes);
        p( '50% -- 75% free space blocks', l_fs3_blocks);
        p( '50% -- 75% free space bytes', l_fs3_bytes);
        p( '75% -- 100% free space blocks', l_fs4_blocks);
        p( '75% -- 100% free space bytes', l_fs4_bytes);
        p( 'Unused Blocks', l_unformatted_blocks );
        p( 'Unused Bytes', l_unformatted_bytes );
        p( 'Total Blocks', l_full_blocks);
        p( 'Total bytes', l_full_bytes);
       
    end if;

end;


/* 举例:表AAA是ASSM 类型,表BBB是MANUAL类型,注意要对表进行分析analyze
  
SQL> exec show_space('aaa');
Total Blocks............................512
Total Bytes.............................4194304
Unused Blocks...........................75
Unused Bytes............................614400
Last Used Ext FileId....................15
Last Used Ext BlockId...................8
Last Used Block.........................53
 *************************************************
The segment is analyzed
0% -- 25% free space blocks.............0
0% -- 25% free space bytes..............0
25% -- 50% free space blocks............0
25% -- 50% free space bytes.............0
50% -- 75% free space blocks............0
50% -- 75% free space bytes.............0
75% -- 100% free space blocks...........134
75% -- 100% free space bytes............1097728
Unused Blocks...........................0
Unused Bytes............................0
Total Blocks............................287
Total bytes.............................2351104


ASSM 类型的索引

SQL> exec show_space('t_index','auto','i');
Total Blocks............................80
Total Bytes.............................655360
Unused Blocks...........................5
Unused Bytes............................40960
Last Used Ext FileId....................9
Last Used Ext BlockId...................25312
Last Used Block.........................3

MANUAL类型

SQL> exec show_space('bbb','manual');
Total Blocks............................424
Total Bytes.............................3473408
Unused Blocks...........................2
Unused Bytes............................16384
Last Used Ext FileId....................17
Last Used Ext BlockId...................225
Last Used Block.........................6
Free Blocks.............................0

*/
/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3898/viewspace-784345/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    108
  • 访问量
    790610