【发布时间】:2021-07-07 22:02:17
【问题描述】:
我正在寻找一个 SQL 查询来给我这种输出:
table_owner table_name partition_name data (bytes) indexes (bytes)
MY_OWNER MY_TABLE P01 12345678 23456789
MY_OWNER MY_TABLE P02 34567890 45678901
MY_OWNER MY_TABLE P03 56789012 67890123
...
我访问了How do I calculate tables size in Oracle,但没有找到我要查找的内容,因为它始终针对每个表、每个所有者/架构,但从不针对每个分区。
我知道字节数可能不能真正代表现实,因为它可能是“磁盘中的实际字节数”和/或“预分配的字节数”(实际数据只能使用该预分配空间的 1%),但我愿意拥有这个值,即使它是预分配的或实际使用的字节数。
注意事项:
- 使用
Oracle 18c Enterprise - 我们不关心系统表、ORACLE 表、维护表等,只关注我自己为数据创建的表
- 表空间名称始终对于同一架构中的所有表中的所有分区都相同,当然每个架构的每个表空间名称都不同
- 无需在
Kb、Mb、Gb甚至Tb中四舍五入,如果可能的话,我更喜欢bytes。 - 不需要pourcentage,不需要最大可用空间
- 我只使用
partitions,不使用任何subpartitions - 如果我们需要在每个模式、表和分区上循环,我可以使用 PL/SQL 块
- 我猜我可以由任何用户运行此查询
有什么想法吗?
【问题讨论】:
-
未分区的表呢?具有分区索引的表是不同的表空间 [s] 呢?将 dba_segments 与 dba_indexes 结合起来会让您接近。
-
@ik_zelf:确实,所以首先我们不关心未分区的表,因为所有 MY 表都肯定是分区的(至少,如果是新模式,它们至少有一个分区,不管是什么原因)第二表空间名称在整个架构中始终相同,并且每个架构/所有者都有唯一的表空间名称
-
@ik_zelf 感谢您注意到我没有澄清的这些要点
标签: oracle