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

时间:2011-06-30 20:12:58

标签: oracle resources delete-row

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

要检查尺寸,我正在查看dba_segments

4 个答案:

答案 0 :(得分:13)

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

一个表由扩展区组成,这些扩展区的大小可能不同,但我们假设它们只是1MB块。

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

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

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

让我们说你填充三个1MB扩展区然后删除所有行 - 表是空的,但Oracle不会将HWM移回,或者释放那些使用过的扩展区。因此即使它是空的,该表也将在磁盘上占用3MB,但是有3MB的可用空间可以在其中重复使用。新的插入将进入HWM下方的空间,直到它再次填满HWM再次移动。

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

alter table t1 shrink space;

如果你没有使用ASSM,你需要考虑一个表重组来恢复空间。

答案 1 :(得分:1)

看看this site 关于删除行后的表大小。

  

删除时有效地重用空间。您的数据库不会显示任何新的免费   dba_free_space中的空格 - 它将在freelists上有更多的块,而在空洞中会有更多的空洞   指数结构。

答案 2 :(得分:1)

如果你想“回收”空间,最简单的方法是:

ALTER TABLE table MOVE TABLESPACE different_tablespace;

ALTER TABLE table MOVE TABLESPACE original_tablespace;

为您提供:

  1. 一些停机时间
  2. 第二个表空间,有足够的空间将表格转移到。

答案 3 :(得分:-1)

SELECT SUM(BYTES) 
FROM DBA_SEGMENTS 
WHERE SEGMENT_NAME LIKE 'YOUR TABLE NAME%';

你会得到正确的答案。