在oracle数据库中,如何计算一个表所占用的存储空间呢?我们可以通过系统视图dba_segments、user_segmetns、dba_tables来查看一个
在oracle数据库中,,如何计算一个表所占用的存储空间呢?我们可以通过系统视图dba_segments、user_segmetns、dba_tables来查看一个表所占空间的大小,如下所示:
select segment_name table_name
,sum(blocks) blocks
,sum(bytes)/(1024*1024) table_size[mb]
from user_segments
where segment_type='table'
and segment_name=&table_name
group by segment_name;
select segment_name table_name
,sum(blocks) blocks
,sum(bytes)/(1024*1024) table_size[mb]
from dba_segments
where segment_type='table'
and segment_name=&table_name
group by segment_name;
注意,如果你通过系统视图dba_tabels、user_tables统计、查看表所占的空间大小,那么由于统计信息过时或总是持续有dml操作(insertr、update、delete),那么有可能用下面sql统计出的信息可能不准确。需要先收集一下表对象的统计信息。 另外,可能每个数据库的db_block_size有所不同,不一定是8192。所以注意修改.
analyze table owner.table_name compute statistics;
或
exec dbms_stats.gather_table_stats('owner','table_name');
select owner owner_name
,table_name table_name
,tablespace_name tablespace_name
,blocks actual_blocks
,blocks + empty_blocks total_blocks
,(blocks + empty_blocks) * 8192/(1024*1024)
table_size[mb]
from dba_tables
where owner=&owner
and table_name=&table_name
关于dba_tables和dba_segments表中的block的区别,其实它们的关系如下所示:
自动段空间管理(automatic segment space management assm)
dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks
本地管理表空间(locally managed tablespace )
dba_segments.blocks = dba_tables.blocks + dba_tables.empty_blocks+ 1(segment header block)
dba_segments.blocks holds the total number of blocks allocated to the table.
dba_tables.blocks holds the total number of blocks allocated for data.
dba_segments中的blocks表示分配给表的存储空间,而dba_tables中blocks表示表中数据实际占有的存储空间。所以这个是有细微差别的。所以你如果要查表的实际占用大小,那么就要使用dba_tables来查询。查看数据库中占用存储空间从大到小的所有表对象
select segment_name table_name
,sum(blocks) blocks
,sum(bytes)/(1024*1024) table_size[mb]
from dba_segments
where segment_type='table'
group by segment_name
order by blocks desc;
本文永久更新链接地址: