最初由 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');
啊
这个问题很早很早很早就想问了,太奇怪了,万分迷茫,困饶了我好几个晚上睡不着了
请大家指点一下,谢谢!
|