Oracle19c中,DBMS_SPACE.OBJECT_GROWTH_TREND仅能展示DBA_HIST_SEG_STAT的历史空间用量,无预测功能。实际趋势预测需基于该视图结合REGR_SLOPE线性回归函数计算增长率。CREATE_TABLE_COST等过程为静态估算,不记录历史变化。同时还需警惕SYSAUX表空间因AWR组件失控导致持续膨胀。
出差路上,把Oracle 19c里DBMS_SPACE包那些容易让人绕进去的地方捋一捋。先说结论:DBMS_SPACE.OBJECT_GROWTH_TREND这个函数,名字起得挺有欺骗性,但它真不是用来做预测的。
你如果指望它告诉你“这张表30天后会涨到多少G”,那你大概率要失望了。它干的事情其实很简单——把DBA_HIST_SEG_STAT视图里现成的历史快照数据拉出来给你看。每一个结果行就是一个快照点的空间用量,字段无非是OBJECT_NAME、SPACE_USED、SNAP_TIME这些。没有斜率,没有增长率,没有任何预测模型。你拿到的,就是一堆过去的数据点。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

这里有几点值得注意:它不接受时间范围参数,你没法指定只看最近7天还是30天。它的输出里也找不到任何“forecast”“slope”“prediction”之类的字段。更关键的是,它严重依赖DBA_HIST_SEG_STAT视图:这个视图在19c下算是稳定填充space_used字段了,但在12c及更早版本里,这个字段经常是NULL,查出来全是空的。还有,默认情况下AWR只保留最近8天的数据,受dba_hist_wr_control.retention控制。如果你要看30天的趋势,得先确认retention是否已经调大。
所以,真正能干活的是DBA_HIST_SEG_STAT加上Oracle内置的线性回归函数。这不是DBMS_SPACE包能替你代劳的。
怎么干?思路其实不复杂:
这里有个小建议:别直接用原始字节数去算,除以1024*1024换算成MB/天,读数会舒服得多。用GB/天的话,小数点后面可能拖一大串,反而不直观。
顺便提一下DBMS_SPACE包里的另外两个常用过程:CREATE_TABLE_COST和CREATE_INDEX_COST。这两个是纯粹的静态估算,跟你谈增长没有任何关系。它们基于当前的统计信息、字段定义、行数假设,算的是“刚建表或索引时需要预留多少空间”。如果业务逻辑是行数每月翻倍,那这个估算的结果一天之后就不准了。
CREATE_INDEX_COST尤其依赖dbms_stats.gather_table_stats的结果。统计信息一旦过期,估算偏差达到3到5倍是常有的事。它们返回的结果分为used_bytes(实际数据+块头+pctfree)和alloc_bytes(含extent分配粒度),但完全不考虑索引分裂、LOB段扩展、IOT溢出这类运行时开销。如果你试图用今天CREATE_TABLE_COST的结果减去昨天的结果来倒推日增量——这条路是走不通的,因为它根本不做历史记录,也不支持增量计算。
最后,说一个在实际工作中容易被忽略的坑:SYSAUX表空间暴涨。
当你发现DBA_HIST_SEG_STAT或DBA_HIST_TBSPC_SPACE_USAGE里某天的数据突然飚高了50G,先别急着觉得是业务表出了问题。大概率是SYSAUS里的AWR组件失控了。WRH$_ACTIVE_SESSION_HISTORY这一张表占满SYSAUX,不仅让空间趋势曲线变得难看,还会拖慢所有涉及AWR的查询。
排查方法很简单:先查一下WRH$_ACTIVE_SESSION_HISTORY的行数,超过200万行基本可以锁定问题。
处理的时候要注意顺序:别一上来就DELETE。先调小baseline窗口,执行DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS,把retention降到7天。确认没有静态baseline后,再执行DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE清理数据。清理完了,马上查dba_hist_tbspc_space_usage,看看SYSAUX的tablespace_usedsize是否回落。这一步不做,你之前做的所有趋势分析都可能白费。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述