如何预测Oracle的表大小?

fil*_*ppo 4 oracle datatable

我正在尝试对我拥有的一些表进行增长预测,为此我必须对我的行大小进行一些计算,我每天生成多少行以及数据.

我正在计算表格中每行的平均大小,作为每个字段平均大小的总和.基本上:

SELECT 'COL1' , avg(vsize(COL1)) FROM TABLE union
SELECT 'COL2' , avg(vsize(COL2)) FROM TABLE
Run Code Online (Sandbox Code Playgroud)

总结一下,乘以一天的条目数并从那里开始预测.

事实证明,对于其中一个表,我看起来结果大小比我想象的要小得多,让我想知道我的方法是否正确.

此外,我没有考虑我的预测的索引大小 - 当然我应该.

我的问题是:

  1. 这种方法我使用可靠吗?

  2. 关于如何处理索引预测的提示?

我已经完成了我的谷歌搜索,但我找到的方法都是关于段和扩展或基于整个表的计算.我需要使用我的表的实际行来执行预测(我必须分析表中的数据以便计算每天的记录数).

最后,这是一个近似值.我知道我在这里和那里都缺少一些字节和开销.我只是想确保我只丢失字节而不是gigas :)

Vin*_*rat 5

1)您的方法可以计算出一行的平均大小.(虽然请注意,如果您的列包含null,则应使用avg(nvl(vsize(col1), 0))而不是avg(vsize(COL1))).但是,它没有考虑行的物理排列.

首先,它没有考虑标题信息(来自块和行):你不能将8k数据放入8k块.有关更多信息,请参阅有关数据块格式的文档.

然后,行并不总是整齐地存储.Oracle在每个块中占用一些空间,以便在更新行(由pctfree参数控制)时行可以增长.此外,当删除行时,不会立即回收空白空间(如果您没有将ASSM与本地管理的表空间一起使用,则块返回可用块列表所需的可用空间量取决于pctused).

如果表中已有一些代表性数据,则可以通过比较物理上使用的空间(all_tables.blocks*block_size收集统计数据后)与平均行长度来估算所需的额外空间量.

顺便说一下,Oracle可以轻松地为您提供平均行长度的良好估计:收集表和查询的统计信息all_tables.avg_row_len.

2)大多数时候(阅读:除非有错误或你陷入非典型的索引使用),索引将按比例增长到行数.

如果您有代表性数据,则可以通过将实际大小乘以行数的相对增长来估计其未来规模.