Erp100论坛's Archiver

xiangzhao 发表于 2008-7-12 21:28

表占用多大磁盘空间?——统计脚本

/****************1、建立临时表********************/
create table temp_table_size
(
   table_name   varchar2(30)  not null,              --表名
   main_size    number(12,3)  default 0 not null,    --表主段空间(单位:MB)
   lob_size     number(12,3)  default 0 not null,    --LOB大字段空间
   data_size    number(12,3)  default 0 not null,    --数据空间(主空间 + LOB)
   index_size   number(12,3)  default 0 not null,    --索引空间
   total_size   number(12,3)  default 0 not null,    --总占用空间(加索引空间)
   record_count number(15)    default 0 not null     --记录数
);

alter table temp_table_size add constraint pk_temp_table_size primary key (table_name);

insert into temp_table_size (table_name) select table_name from user_tables;

commit;


/**************2、表各项统计*****************/
declare
  v_size_1 number(12,3);
  v_size_2 number(12,3);
  v_size_3 number(12,3);
  v_count  number(15);
begin
  --数据初始化
  update temp_table_size
    set main_size  = 0,
        lob_size   = 0,
        data_size  = 0,
        index_size = 0,
        total_size = 0,
        record_count = 0;


  for v_rec in (select table_name from user_tables) loop

    --主数据段空间
    select sum(bytes) / 1024 / 1024
      into v_size_1
      from user_segments
      where segment_name = v_rec.table_name;

    --LOB空间
    select nvl(sum(bytes),0) / 1024 / 1024
      into v_size_2
      from user_segments
      where segment_name in
      (
        select segment_name
          from user_lobs
          where table_name= v_rec.table_name
      );
   
    --索引空间
    select nvl(sum(bytes),0) / 1024 / 1024
      into v_size_3
      from user_segments
      where segment_name in
      (
        select index_name
          from user_indexes
          where table_name= v_rec.table_name
      );
   
    --表记录数统计
    execute immediate 'select count(*) from ' || v_rec.table_name into v_count;


    --写统计结果
    update temp_table_size
      set main_size    = v_size_1,
          lob_size     = v_size_2,
          index_size   = v_size_3,
          data_size    = v_size_1 + v_size_2,
          total_size   = v_size_1 + v_size_2 + v_size_3,
          record_count = v_count
      where table_name = v_rec.table_name;
   
  end loop;
   
  --保存结果
  commit;

end;
/

/**************3、查看统计结果***************/
select *
  from temp_table_size
  order by table_name;

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.