田灬禾-不忘初心,方得始終

寧靜以逸遠,心靜而無邪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

show_space查看对像数据块的空闲情况

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

  PROCEDURE p(p_label IN VARCHAR2,
              p_num   IN NUMBER) IS
  BEGIN
    dbms_output.put_line(rpad(p_label, 40, '.') ||
                         (p_num));
  END;
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 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('Unformatted Blocks  ', l_unformatted_blocks);
    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);
  END IF;

  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;
参数说明:
  p_segname:对像名称
  p_owner:对像所属用户名
  p_type:对像类型(常用的:INDEX,TABLE,TABLE PARTITION,INDEX PARTITION,CLUSTER)
  p_partition :如果是分区对像,分区名
调用举例:
BEGIN
 SHOW_SPACE(p_segname => 'TT',p_owner => 'USER',p_type => 'TABLE PARTITION',p_partition => 'M_201607');
END;
或 exec show_space('MY_OBJECTS');
Unformatted Blocks ....................
0 FS1 Blocks (0-25) ....................0 FS2 Blocks (25-50) ....................1 FS3 Blocks (50-75) ....................0 FS4 Blocks (75-100) ....................4 Full Blocks ....................0 Total Blocks ...........................8 Total Bytes ...........................65536 Total MBytes ...........................0 Unused Blocks...........................0 Unused Bytes ...........................0 Last Used Ext FileId....................16 Last Used Ext BlockId...................97 Last Used Block.........................8

结果可知:该对像在当前有分区中,总共Total Blocks 8 其中存在空余空间在25%-50%的块有1个,存在空余空间在75%-100%的块有4个;通过这些信息可以来决定是否需要整理碎片shrink或move;

posted on 2016-08-09 17:47  田灬禾  阅读(328)  评论(1编辑  收藏  举报