tom写了个好工具show_space,这个工具对于oracle来讲其实就是个存储过程,这个存储过程可以用来分析空间使用情况,有了此工具,就不用再通过写sql语句来看每条记录或表占用表空间的大小了,使用起来很方便。
具体使用过程如下:
首先需要创建一个存储过程:
d:\>sqlplus /nolog
sql>connect / as sysdba
sql>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_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
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( 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;
/
procedure created.
执行以上语句会在当前用户下生成一个procedure,当前用户为sys用户。
sql>create table t as select * from all_users; (创建表t)
sql> exec show_space(t); (查看表t占用空间大小)
free blocks.............................0
total blocks............................15
total bytes.............................61440
unused blocks...........................13
unused bytes............................53248
last used ext fileid....................13
last used ext blockid...................61782
last used block.........................2
结果马上就出来了,以前必须通过sql语句查询dba_tables才能得到结果,可见,此工具的方便性。
另外,此工具有好几个版本,目前上面这个版本只适合表空间为非assm的时候,assm的时候是不能用的,原因是dbms_space.free_blocks 不允许在assm上操作,解决方法如下:
对于assm,可以使用dbms_space.space_usage