首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 关于系统的物理上不连续的碎片数计算!
【标  题】:关于系统的物理上不连续的碎片数计算!
【关键字】:
【来  源】:http://www.cublog.cn/u/23246/showart.php?id=173281

关于系统的物理上不连续的碎片数计算!

关于系统的物理上不连续的碎片数计算!


http://www.chinaunix.net 作者:wxx  发表于:2004-04-28 11:40:09
发表评论】【查看原文】【Oracle讨论区】【关闭

可以使用如下方法查碎片:
select bytes from dba_free_space;
可以采用如下方法查系统中物理上不连续的碎片:
create table wg_dba_free_space
as select * from dba_free_space where 1=2;
create table wg_free_space as select file_id,block_id,blocks from dba_free_space;

create or replace procedure sp_freespace_wg
/*目的是找出系统中物理上不连续的碎片个数;而通过select count(*) from dba_free_space中得到的数目减去它计算出来的东西,就是可以通过coalesce命令整理的碎片数了。*/
is 
p_file_id   number;
p_block_id  number;
p_blocks      number;
pre_block_id  number;
pre_blocks      number;
pre_file_id     number;
cursor c1 is
   select file_id,block_id,blocks
      from wg_dba_free_space 
    where tablespace_name='TS_BILL1'
      order by file_id asc,block_id asc;
begin
  p_file_id:=0;
  p_block_id:=0;
  p_blocks:=0;
  pre_block_id:=0;
  pre_file_id:=0;

  for dba_data_files_rec in c1 LOOP
    p_file_id:=dba_data_files_rec.file_id;
    p_block_id:=dba_data_files_rec.block_id;
    p_blocks:=dba_data_files_rec.blocks;
    
    if (p_file_id=pre_file_id) and (p_block_id=pre_block_id+p_blocks) then
      /*update*/
      update wg_free_space set
           blocks=blocks+p_blocks
         where file_id=p_file_id 
           and block_id=p_block_id;
    else
      insert into wg_free_space(file_id,block_id,blocks)
                values(p_file_id,p_block_id,p_blocks);
    end if;

    pre_file_id:=p_file_id;
    pre_block_id:=p_block_id; 
    pre_blocks:=p_blocks;  
    commit;
  end loop;  
end;


execute sp_freespace_wg;



 huanggzcn 回复于:2004-01-10 12:16:10

谢谢,收藏


 txfy 回复于:2004-04-28 11:40:09

嗯,这篇文章以前没有看过,今天看了看,觉得有点疑问,楼主能帮解释解释吗?
create table wg_dba_free_space 
as select * from dba_free_space where 1=2; 
这句可以看出表wg_dba_free_space里面没有记录。那么
cursor c1 is 
select file_id,block_id,blocks 
from wg_dba_free_space 
where tablespace_name='TS_BILL1' 
order by file_id asc,block_id asc; 
就什么都选不出来,因为表是空的。从而
for dba_data_files_rec in c1 LOOP 
这个循环什么都不会做,因为cursor是空的,所以你最后这个procedure什么都没做呀?怎么计算?我看不太懂!另外你计算完的结果从什么地方差,楼主能帮我们答疑一下吗?




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=240866
转载请注明作者名及原文出处
ORACLE 面试问题-技术篇:【上一篇】
informix9.4IBM官方简体中文文档-给不爱读英文的XDJM:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 简单的flash与asp.net通信(LoadVars类)
  • RSS 从入门到精通2
  • 如何在游戏机制中使用AI/剧情脚本----基于LUA(ZT)
  • [给我一支烟]2z
  • BHRE Release 1.0
  • 黑吃黑:W32.Netsky.AD@mm病毒分析
  • 下载江湖数据库
  • 组织管理体系推广经验之九-从建立规范化的文化开始
  • java在Linux下的web应用(二)
  • 交换机上控制ip和mac冲突的解决方法
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.