/****************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;