Oracle 10 g – 无法释放表空间中的空间

Oracle 10g中的表空间几乎100%被使用。

大小(MB)= 571,768.0使用(MB)= 571,534.0

我刚删除(并提交)了属于与该表空间相关的模式的表中的数千条logging。 令人惊讶的是,根据企业pipe理器上的表空间页面,没有空间被释放。

问:有什么我需要做的,迫使甲骨文释放相应的删除logging的空间?

alter table {table_name}启用行移动;

alter table {table_name}缩小空间;

您在Enterprise Manager中查看的页面几乎可以肯定地通过比较DBA_DATA_FILES (它告诉您分配给表空间的各种文件的总大小)来报告可用空间, DBA_SEGMENTS (告诉您分配给对象的所有段的总大小在表空间中)。 这不会因为你删除了一些数据而改变。

删除数据时,可以释放分配给特定对象的块和范围内的空间。 因此,如果您从FOO表(和相关的FOO索引)中删除了100 MB的数据,则FOO段的大小不会减小。 但是现在在这个领域还有空间可以容纳另外100MB插入到FOO的插件。 如果从FOO中删除空间以释放表空间中其他段的空间,那么在删除数据之后,您需要重新组织FOO–这是一个有些涉及的过程,可能需要停机以及相当一部分testing。 除非永久减小对象的大小,否则一般不build议 – 如果FOO最终将看到另外100 MB的插入,则缩小FOO段只会使其再次增长是没有好处的。

您可以使用DBMS_SPACE包来查看不同部分有多less可用空间。 这将告诉你空块和填充状态不同的块(0-25%满,25-50%满,50-75%满,75-100%满)。 删除数据时,通常会增加分配给表的空块和部分空块的数量。

就像接受的答案一样,您可以使用Segment Advisor(通过调用dbms_advisor)来估计运行收缩空间操作的空间节省。 [您不需要许可证包来运行细分顾问]

然后,您可以节省一些时间,并将目标定位在您获得最大收益的细分市场。

通常最好创build一个临时表作为创build表temp_table名称select * from table_you_deleted_from; 然后删除原始表中的索引禁用指向该表的约束,然后删除并重新创build该表作为创build表table_you_deleted_from名称select * from temp_table; 重新创build索引并启用约​​束。

在这里,你基本上减less了你的表格大小和索引树长度,也就是更快的回顾。