您的位置:首页 > 数据库 > Oracle

Oracle查看对象空间使用情况show_space

2015-08-02 15:49 579 查看
tom大神写了一个用于查看Oracle数据库对象空间使用情况。

下面演示一下如何使用:

–工具源码

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, '.') ||
to_char(p_num, '999,999,999,999'));
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;


–用法演示

create table test_space
AS
select * from dba_tables;
/


SYS@orcl> exec show_space('TEST_SPACE');


Total Blocks ……………………… 112

Total Bytes ……………………… 917,504

Total MBytes ……………………… 0

Unused Blocks……………………… 3

Unused Bytes ……………………… 24,576

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

Last Used Ext BlockId………………. 115,608

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

PL/SQL 过程已成功完成。

SYS@orcl> delete from test_space;


已删除3044行。

SYS@orcl> commit;


提交完成。

SYS@orcl> exec show_space('TEST_SPACE');


Total Blocks ……………………… 112

Total Bytes ……………………… 917,504

Total MBytes ……………………… 0

Unused Blocks……………………… 3

Unused Bytes ……………………… 24,576

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

Last Used Ext BlockId………………. 115,608

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

PL/SQL 过程已成功完成。

SYS@orcl> truncate table test_space;


表被截断。

SYS@orcl> exec show_space(‘TEST_SPACE’);

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………………. 101,872

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

PL/SQL 过程已成功完成。

drop table test_space;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: