【发布时间】:2010-09-17 00:12:39
【问题描述】:
我在 Oracle 数据库中有一个表,每月有几百万新行。每行都有一列,说明它的创建日期。
我想运行一个查询来获取过去 6 个月的磁盘空间增长情况。换句话说,结果将是一个包含两列的表,其中每一行包含月份名称和该月份使用的磁盘空间。
谢谢,
【问题讨论】:
我在 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%。因此,您的身体可能在三个月内没有增长,然后有一个巨大的跳跃,然后再过六个月就没有增长。
【讨论】: