2

我在 Oracle 数据库中有一个表,每个月都有几百万新行。每行都有一列,说明它的创建日期。

我想运行一个查询来获取过去 6 个月的磁盘空间增长情况。换句话说,结果将是一个包含两列的表,其中每一行将包含月份名称和该月份使用的磁盘空间。

谢谢,

4

2 回答 2

4

本文报告了一种获取表增长的方法: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');
于 2010-09-17T00:21:44.327 回答
2

DBA_TABLES(或等价物)给出一个 AVG_ROW_LEN,因此您可以简单地将其乘以每月创建的行数。

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

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

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

于 2010-09-17T01:38:52.147 回答