如何在 Oracle DBMS 9i 中删除数据并释放磁盘空间

Oh *_*oon 2 oracle oracle9i

我想知道通常如何从 Oracle 9i DBMS 中删除数据,这实际上释放了磁盘空间。在过去的场景中,我们遇到过这样的情况,即清除 1-2 百万行数据并不会转化为磁盘空间使用量的减少。

设想:

sqlplus > delete from audit_log where date_created between today and the day before;

sqlplus > 2 million records deleted.

bash$: du -sh (after issuing the delete above)
Run Code Online (Sandbox Code Playgroud)

结果不会改变磁盘空间使用情况。

这也让我想到了一个问题,是否需要刷新表,以便 oracle 完全删除所有应该被删除 DML 删除的数据

小智 5

在 Oracle 中,从表中删除行不会自动释放任何磁盘空间。可以释放磁盘空间,但要实现此目的,您必须了解表在数据文件中的物理位置。一旦数据文件末尾有空块,您就可以将数据文件调整为较小的大小。只有在此 - 成功 - 操作之后,您才能获得真正的磁盘空间。如果数据文件中有很多空块,但最后没有,最简单的方法是将表从数据文件所属的表空间移动到新表空间并删除旧表空间。这不适用于 SYSTEM 表空间,不允许将 SYS 对象移动到其他表空间。

有时,当您只能移动一个碰巧阻止释放空间的小表时,您就很幸运了,因为它被放置在数据文件的末尾。在这种情况下,一个简单的alter table thesmalltable move;将重新定位该表并在数据文件 [s] 的末尾创建可回收的空间。之后,alter database datafile '/your/df/name.dbf' resize the_new_size;释放磁盘空间。

表在逻辑上放置在表空间中。一个表空间由最少 1 个数据文件组成,在许多情况下由多个数据文件组成。