删除多行后的Oracle 10g表大小

标签 oracle resources delete-row

作为维护的一部分,我们从一个表中删除了大量记录,并希望将此空间用于其他表。问题是我正在检查表格的大小,它在删除之前显示相同的原始大小。我在这里缺少什么?

要检查大小,我正在查看 dba_segments

最佳答案

在真正了解空间使用情况之前,您需要了解一些有关表的概念。我会试着给你 5 秒的游览......

一个表由范围组成,这些范围的大小可能会有所不同,但我们在这里假设它们是 1MB 块。

创建表时,通常会添加 1 个范围,因此即使该表没有行,它也会占用 1MB。

当您插入行时,Oracle 有一个表的内部指针,称为高水位线 (HWM)。 HWM 下面是格式化的数据块,上面是未格式化的块。它从零开始。

如果以一个新表为例,并开始插入行,HWM 将向上移动,提供越来越多的第一个范围供表使用。当该范围全部用完时,将分配另一个范围并重复该过程。

假设您填充了三个 1MB 的范围,然后删除所有行 - 表为空,但 Oracle 不会将 HWM 移回原位,或释放那些使用过的范围。因此,即使该表为空,该表也将占用 3MB 磁盘空间,但其中仍有 3MB 可用空间可重用。新的插入将进入 HWM 下方的那个空间,直到在 HWM 再次移动之前它再次被填满。

要恢复空间,如果您的表使用的是 ASSM,则可以使用以下命令:

alter table t1 shrink space;

如果您不使用 ASSM,则需要考虑重新组织表以恢复空间。

关于删除多行后的Oracle 10g表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6540546/

相关文章:

sql - 在 Oracle 中选择带有 "for update skip locked"的前 N ​​个

visual-studio - 如何让 Windows 窗体设计器使用来自外部程序集的资源?

c# - .NET 全局化和卫星 DLL

mysql - 在 SQL 中使用 Join 删除操作

javascript - 使用隐藏类型和 javascript 删除 html 表中的一行

oracle - 为什么 PostgreSQL 允许没有 order by expression 的 frame 子句?

Oracle V$OSSTAT

.net - WPF中基于位置的样式可能吗?

azure - 删除数据流中日期范围内的数据