表使用的Oracle磁盘空间

问题描述:

我在Oracle数据库中有一个表,每个月都会有几百万个新行。每行都有一个表示创建日期的列。表使用的Oracle磁盘空间

我想运行一个查询来获得过去6个月的磁盘空间增长。换句话说,结果将是一个有两列的表,其中每一行都有该月的名称和磁盘空间。

感谢,

本文报告得到表增长的方法:http://www.dba-oracle.com/t_table_growth_reports.htm

column "Percent of Total Disk Usage" justify right format 999.99 
column "Space Used (MB)" justify right format 9,999,999.99 
column "Total Object Size (MB)" justify right format 9,999,999.99 
set linesize 150 
set pages 80 
set feedback off 

select * from (select to_char(end_interval_time, 'MM/DD/YY') mydate, sum(space_used_delta)/1024/1024 "Space used (MB)", avg(c.bytes)/1024/1024 "Total Object Size (MB)", 
round(sum(space_used_delta)/sum(c.bytes) * 100, 2) "Percent of Total Disk Usage" 
from 
    dba_hist_snapshot sn, 
    dba_hist_seg_stat a, 
    dba_objects b, 
    dba_segments c 
where begin_interval_time > trunc(sysdate) - &days_back 
and sn.snap_id = a.snap_id 
and b.object_id = a.obj# 
and b.owner = c.owner 
and b.object_name = c.segment_name 
and c.segment_name = '&segment_name' 
group by to_char(end_interval_time, 'MM/YY')) 
order by to_date(mydate, 'MM/YY'); 

DBA_TABLES(或同等学历)给出了一个AVG_ROW_LEN,所以你可以简单地乘上的行数每个月创建一次。

需要注意的是,它假定新行的行长度与现有行的行长度相似。如果你有一堆“小”(例如50字节)的历史数据,但新的行较大(150字节),那么估计值就会太低。

此外,更新如何成为事物?如果一行开始于50个字节,并在两个月后增长到150个,那么您如何计算这100个字节?

最后,对于每一行插入,表不会增长。每隔一段时间分配的空间就会被填满,并且会分配另一块。根据表设置,下一个块可能是现有表大小的50%。所以你可能在三个月内没有身体成长,然后有一个大的跳跃,然后再增长六个月。

+0

使用DBA_SEGMENTS而不是DBA_TABLES。它会告诉你一个对象在磁盘上使用多少空间,并且不依赖于估计或统计数据。 – 2010-09-17 03:19:09

+0

请记住,一个表可以由DBA_TABLES不会考虑的分区组成。正如jonearles所建议的那样,DBA_SEGMENTS和占用分区,同样,如果您想要包含二进制对象列(BLOB,CLOB)DBA_LOBS也是因为未内联存储的LOB在其自己的段中。 – Stellios 2010-09-17 07:01:58

+0

据我所知AVG_ROW_LEN是一个优化器统计量,而不是一个真正的度量。我的意思是,用适当的权限,你可以覆盖它的价值。请参阅http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#i997763 – gpeche 2010-09-17 09:59:40