tom的show_space分析空间使用情况

 

         TOMSHOW_SPACE工具可以用来分析空间使用情况,有了此工具,就不用再通过写SQL语句来看每条记录或表占用表空间的大小了,使用起来很方便

 

1.脚本创建:

 

create or replace procedure show_space(p_segname   in varchar2,

                                       p_owner     in varchar2 default user,

                                       p_type      in varchar2 default 'TABLE',

                                       p_partition in varchar2 default NULL)

-- this procedure uses authid current user so it can query DBA_*

  -- views using privileges from a ROLE and so it can be installed

  -- once per database, instead of once per user that wants to use it

authid current_user as

  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;

  l_segment_space_mgmt varchar2(255);

  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;

  -- inline procedure to print out numbers nicely formatted

  -- with a simple label

  procedure p(p_label in varchar2, p_num in number) is

  begin

    dbms_output.put_line(rpad(p_label, 40, '.') ||

                         to_char(p_num, '999,999,999,999'));

  end;

begin

  -- this query is executed dynamically in order to allow this procedure

  -- to be created by a user who has access to DBA_SEGMENTS/TABLESPACES

  -- via a role as is customary.

  -- NOTE: at runtime, the invoker MUST have access to these two

  -- views!

  -- this query determines if the object is an ASSM object or not

  begin

    execute immediate 'select ts.segment_space_management

from dba_segments seg, dba_tablespaces ts

where seg.segment_name = :p_segname

and (:p_partition is null or

seg.partition_name = :p_partition)

and seg.owner = :p_owner

and seg.tablespace_name = ts.tablespace_name'

      into l_segment_space_mgmt

      using p_segname, p_partition, p_partition, p_owner;

  exception

    when too_many_rows then

      dbms_output.put_line('This must be a partitioned table, use p_partition => ');

      return;

  end;

  -- if the object is in an ASSM tablespace, we must use this API

  -- call to get space information, else we use the FREE_BLOCKS

  -- API for the user managed segments

  if l_segment_space_mgmt = 'AUTO' then

    dbms_space.space_usage(p_owner,

                           p_segname,

                           p_type,

                           l_unformatted_blocks,

                           l_unformatted_bytes,

                           l_fs1_blocks,

                           l_fs1_bytes,

                           l_fs2_blocks,

                           l_fs2_bytes,

                           l_fs3_blocks,

                           l_fs3_bytes,

                           l_fs4_blocks,

                           l_fs4_bytes,

                           l_full_blocks,

                           l_full_bytes,

                           p_partition);

  

    p('FS1 Blocks (0-25) ', l_fs1_blocks);

    p('FS2 Blocks (25-50) ', l_fs2_blocks);

    p('FS3 Blocks (50-75) ', l_fs3_blocks);

    p('FS4 Blocks (75-100)', l_fs4_blocks);

    p('Full Blocks ', l_full_blocks);

  else

    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;

  -- and then the unused space API call to get the rest of the

  -- information

  dbms_space.unused_space(segment_owner             => p_owner,

                          segment_name              => p_segname,

                          segment_type              => p_type,

                          partition_name            => p_partition,

                          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('Total MBytes', trunc(l_total_bytes / 1024 / 1024));

  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);

end;

/

 

2.脚本的使用:

----首先创建一个测试表,然后分析该表的空间的使用情况

sys@ORCL>create table zhong(id int);

Table created.

 

sys@ORCL>set serverout on

sys@ORCL>exec show_space('ZHONG')

Free Blocks.............................               0

Total Blocks............................               8

Total Bytes.............................          65,536

Total MBytes............................               0

Unused Blocks...........................               7

Unused Bytes............................          57,344

Last Used Ext FileId....................               1

Last Used Ext BlockId...................          99,728

Last Used Block.........................               1

PL/SQL procedure successfully completed.

 

----然后插入数据,再次分析该表的空间使用情况

sys@ORCL>begin

  2  for i in 1..10000 loop

  3    insert into zhong values(i);

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

 

sys@ORCL>exec show_space('ZHONG')

Free Blocks.............................               5

Total Blocks............................              24

Total Bytes.............................         196,608

Total MBytes............................               0

Unused Blocks...........................               3

Unused Bytes............................          24,576

Last Used Ext FileId....................               1

Last Used Ext BlockId...................          99,744

Last Used Block.........................               5

PL/SQL procedure successfully completed.

 

----delete表数据后,再次查看

 

sys@ORCL>delete zhong;

10000 rows deleted.

 

sys@ORCL>exec show_space('ZHONG')

Free Blocks.............................               5

Total Blocks............................              24

Total Bytes.............................         196,608

Total MBytes............................               0

Unused Blocks...........................               3

Unused Bytes............................          24,576

Last Used Ext FileId....................               1

Last Used Ext BlockId...................          99,744

Last Used Block.........................               5

PL/SQL procedure successfully completed.

 

----整理下碎片,降低高水位,在查看变化

sys@ORCL>alter table zhong move;

Table altered.

 

sys@ORCL>exec show_space('ZHONG')

Free Blocks.............................               0

Total Blocks............................               8

Total Bytes.............................          65,536

Total MBytes............................               0

Unused Blocks...........................               7

Unused Bytes............................          57,344

Last Used Ext FileId....................               1

Last Used Ext BlockId...................          99,752

Last Used Block.........................               1

PL/SQL procedure successfully completed.

 

 

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

转载于:http://blog.itpub.net/30130773/viewspace-2101593/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值