刚写的一个得到表物理大小的一个过程

[复制链接]
查看11 | 回复9 | 2007-9-26 17:05:46 | 显示全部楼层 |阅读模式
方法一:从user_tables查,但是如果从user_tables查table的大小,需要分析表
方法二:如果从user_extends查的话,查到的是表所有的扩展的大小,而实际要的是高水位线(HWM)以下的大小;
而且如果trancate表后的查询就会有问题!
所以刚才搜了点资料,写了一个过程用来得到objects的实际大小
create or replace procedure getObjectSize
(

Nuser in varchar2, ---用户

Nname in varchar2,--objects的名称

Ntype varchar2 default 'TABLE'
) is

v_total_blocks
NUMBER;

v_total_bytes
NUMBER;

v_unused_blocks
NUMBER;

v_unused_bytes
NUMBER;

v_last_used_extent_file_idNUMBER;

v_last_used_extent_block_id NUMBER;

v_last_used_block NUMBER;
BEGIN

dbms_space.unused_space(Nuser, Nname, Ntype, v_total_blocks, v_total_bytes, v_unused_blocks,

v_unused_bytes, v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block);

dbms_output.put_line('total_bytes:' || v_total_bytes);

dbms_output.put_line('unused_bytes:' || v_unused_bytes);

dbms_output.put_line('size:' ||

((v_total_bytes - v_unused_bytes) / 1024));
end getObjectSize;
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
SQL> set serveroutput on
SQL> exec getObjectSize('ZXT','F_TGS_TRANSGRESSBASICINFO');
total_bytes:17031168
unused_bytes:139264
size:16496
PL/SQL procedure successfully completed
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
学习,支持!
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
最早的时候tom写过的show_space挺好用.他也是调用dbms_space来实现的。
pub里有现成的code,ineternet上到处都是.
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
学习了
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
最初由 Toms_zhang 发布
[B]最早的时候tom写过的show_space挺好用.他也是调用dbms_space来实现的。
pub里有现成的code,ineternet上到处都是. [/B]

呵呵,确实很多!


回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
给个关于dbms_space的链接!
http://www.cs.umbc.edu/help/orac ... a68001/dbms_spa.htm
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
最初由 myfriend2010 发布
[B]方法一:从user_tables查,但是如果从user_tables查table的大小,需要分析表
方法二:如果从user_extends查的话,查到的是表所有的扩展的大小,而实际要的是高水位线(HWM)以下的大小;
而且如果trancate表后的查询就会有问题!
所以刚才搜了点资料,写了一个过程用来得到objects的实际大小
create or replace procedure getObjectSize
(

Nuser in varchar2, ---用户

Nname in varchar2,--objects的名称

Ntype varchar2 default 'TABLE'
) is

v_total_blocks
NUMBER;

v_total_bytes
NUMBER;

v_unused_blocks
NUMBER;

v_unused_bytes
NUMBER;

v_last_used_extent_file_idNUMBER;

v_last_used_extent_block_id NUMBER;

v_last_used_block NUMBER;
BEGIN

dbms_space.unused_space(Nuser, Nname, Ntype, v_total_blocks, v_total_bytes, v_unused_blocks,

v_unused_bytes, v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block);

dbms_output.put_line('total_bytes:' || v_total_bytes);

dbms_output.put_line('unused_bytes:' || v_unused_bytes);

dbms_output.put_line('size:' ||

((v_total_bytes - v_unused_bytes) / 1024));
end getObjectSize; [/B]

这些代码我是有看过,网络上有,但是这里我仍然非常非常非常非常不理解的是:
v_total_blocks
NUMBER;

v_total_bytes
NUMBER;

v_unused_blocks
NUMBER;

v_unused_bytes
NUMBER;

v_last_used_extent_file_idNUMBER;

v_last_used_extent_block_id NUMBER;

v_last_used_block NUMBER;
这些东西根本就没有被赋值,怎么可以直接放在dbms_space.unused_space(Nuser, Nname, Ntype, v_total_blocks, v_total_bytes, v_unused_blocks,

v_unused_bytes, v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block);
里使用呢???








也不是外面送进来的外部变量 ,你真正调用的时候是
exec getObjectSize('ZXT','F_TGS_TRANSGRESSBASICINFO');

这个问题很早很早很早就想问了,太奇怪了,万分迷茫,困饶了我好几个晚上睡不着了
请大家指点一下,谢谢!
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
你可以打开dbms_space.unused_space看看这个过程的参数,很有意思的,和java有点不一样,不是每一个值都必须赋给得,有些值值有default,也就是默认值,这样的话就没必要一定要给他赋值,你可一赋也可以不赋,
dbms_space.unused_space(Nuser, Nname, Ntype, v_total_blocks, v_total_bytes, v_unused_blocks,
v_unused_bytes, v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block); 可以
exec getObjectSize('ZXT','F_TGS_TRANSGRESSBASICINFO');也可以
就这样!
回复

使用道具 举报

千问 | 2007-9-26 17:05:46 | 显示全部楼层
最初由 myfriend2010 发布
[B]你可以打开dbms_space.unused_space看看这个过程的参数,很有意思的,和java有点不一样,不是每一个值都必须赋给得,有些值值有default,也就是默认值,这样的话就没必要一定要给他赋值,你可一赋也可以不赋,
dbms_space.unused_space(Nuser, Nname, Ntype, v_total_blocks, v_total_bytes, v_unused_blocks,
v_unused_bytes, v_last_used_extent_file_id, v_last_used_extent_block_id, v_last_used_block); 可以
exec getObjectSize('ZXT','F_TGS_TRANSGRESSBASICINFO');也可以
就这样! [/B]

那么也就是说不传这些参数也可以的拉?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行