代码之家  ›  专栏  ›  技术社区  ›  b.roth

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

  •  2
  • b.roth  · 技术社区  · 15 年前

    Oracle10g中的表空间几乎100%被使用。

    大小(MB)=571768.0
    已用(MB)=571534.0

    我刚刚删除(并提交)了一个表中的数千条记录,这些记录属于与该表空间相关联的模式。令人惊讶的是,根据EnterpriseManager上的表空间页面,没有释放出任何空间。

    问题:我需要做什么来强制Oracle释放与已删除记录对应的空间?

    3 回复  |  直到 7 年前
        1
  •  5
  •   FerranB Tom    15 年前

    您看到的空间是表空间上的段。

    表空间包含段。每个段都与一个索引或一个表相关联。段包含扩展,扩展包含块。对于表,块包含行。

    删除表中的行时,将释放按行排列的空间,但新段的空间保持相等。

    要释放此空间,您可以尝试:

    ALTER TABLESPACE xxx COALESCE;
    

    ALTER TABLE xxx MOVE;
    

    第一个,威尔 "combine all contiguous free extents into larger contiguous extents" . 根据您的配置,这可以由Oracle自动执行。另外,可能是因为数据相对于段上的高水位线的位置不太自由。

    第二个 "lets you relocate data of a nonpartitioned table or of a partition of a partitioned table into a new segment, optionally in a different tablespace, and optionally modify any of its storage attributes." . 对此要小心,因为您需要空闲空间来实现这一点,可以对另一个表空间执行它,或者添加更多的数据文件。

        2
  •  1
  •   Amit    15 年前

    如果您使用的是Oracle 10g或更高版本,则可以使用命令清除回收站。

    purge recylebin
    

    甚至可以使用清除与表空间相关的内容

    purge tablespace
    

    这将释放已删除但尚未可用的空间,请注意,当给定表空间出现空间压力时,这将自动可用。

    此外, 您可以使用段顾问来查找所有可以“收缩”的段,并轻松回收您的空间。
    更多阅读 Segment Shrink

    最后一个可以与本地托管表空间一起使用

    Alter Tablespace tablespace_name shrink space
    

    这将释放尽可能多的空间,同时保持其他属性。

        3
  •  0
  •   sangretu    15 年前

    重建索引。