磁盘空间不够了,想删除某个大表里的部分数据,腾出空间,网上查了查,问题还不那么简单。
-------------
请问,如果我只用 delete 删除了数据,不做其它的操作,下次我继续插入数据的时候,系统是将数据存在我删除的那些空间里了,还是存在新的空间里?如果是后者,显然不能达到回收容量的需求,请问大家,我该怎么操作呢?

解决方案 »

  1.   


    块头:块头包含段类型(如表或索引)、数据块地址、表目录、行目录和事务处理插槽。每个插槽的大小为 23 字节,修改块中的行时会使用这些插槽。块头按从上向下的方向扩展。 
    行数据:这是块中行的实际数据。行数据空间按从下向上的方向扩展。 
    空闲空间:空闲空间位于块的中间。这样可以根据需要扩展头和行数据空间。插入了一些新行之后,或者使用较大值更新了现有行的某些列之后,行数据就会占用空闲空间。如果行目录需要更多的行条目,或者需要的事务处理插槽数多于最初配置的数目,就会导致出现头扩展的事件。最初,块中的空闲空间是相邻的。但是,由于执行删除和更新操作可能会导致在块空闲空间中产生碎片。需要时 Oracle 服务器会接合块中的空闲空间。 
      

  2.   

    TRUNCATE 某些大表,回收表空间
      

  3.   


    请问,如果我只用 delete 删除了数据,不做其它的操作,下次我继续插入数据的时候,
    系统是将数据存在我删除的那些空间里了,还是存在新的空间里?
        删除数据之后,会腾出一些空间(数据块),当你再向同一个表中插入数据的话,
    这些数据会插入你腾出的数据块里面;
        但是如果你插入的数据量大于删除的数据量,即腾出的空间不够,那么当将你腾出的空间放满数据后,
        1.如果表空间没别用完,那么将会存放在下一个数据块里面,
        2.如果表空间已经满了,那么你将会面临数据丢失的危险。
        解决办法:增加表空间,但是这将会开辟新空间,即你的可用磁盘将会减小。
        如果磁盘已经满了,那么增加磁盘,再去买个硬盘加上,空间就大了!
      

  4.   

    删除操作,并不会把空间释放,再插入数据指挥插入到其他快里面。
    除非在删除数据后,清理高水位,这样才能使用删除的数据所占用的空间。但这能被这个对象使用,不能被其他对象所使用。说明:
    清理高水位:1、清空表truncate table T;
               2、删除部分数据
                    alter table enable row movement;
                  alter table t shrink space;
      

  5.   

    1、delete from t where ......
    2、alter table t shrink space

    truncate table t直接回收空间
      

  6.   

    貌似删除了数据,dbf也不会减小吧、、、
      

  7.   


    truncate table table_name;
    --此操作是删除表中所有数据,当然会腾出很大的空间,
    --但是一般不这么做,除非你非常肯定这些数据永远也不再需要了!
      

  8.   

    修改数据文件大小,回收磁盘空间.
    ALTER DATABASE DATAFILE '[数据文件]' RESIZE [xxxM]
      

  9.   

    用sql唯一降低高水位线的办法就是truncate,没有其他办法。要达到你的需求,得手动去改block的高水位线标志位。得研究下block的head
      

  10.   

     Alter table table_name deallocate unused
    用于回收DELETE数据后的空白数据块的空间
      

  11.   

    楼主只想删除部分数据,用truncate不大合适吧?
    并且,truncate也不是一定可以使深水线下降。
    个人比较支持修改datafile进行resize的方法。shrink space貌似可以回收free 的extent,
    但是表segment的区是不会被回收的。
    另外,即使表空间回缩,对应的数据文件尺寸也不一定会回缩。
    所以我还是觉得对datafile进行resize比较彻底。
      

  12.   

    悲剧了,如果只是delete的话,恐怕不能使用。
    不过倒是有个办法,如果你其他分区还有空间的话,可以在其他分区创建一个属于当前表空间的数据文件。
      

  13.   

      alter table enable row movement;
      alter table t shrink space;