有好多时候,表经过大量的DML操作后,高水线也会升高,在delete后高水位线还是没下来,也就是说,数据是删除了,但空间并没有释放,这时候我们可 以用alter table move的方法使空间释放,但曾有一次,对表进行MOVE后,空间还是没有释放,下面我就把解决过程模拟一下,就知道之所在了 看一下下面两张表的大小 SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments where SEGMENT_NAME like 'TEST_TB%'; SEGMENT_NAME -------------------- ---------- TEST_TB1 TEST_TB2 查看记录数 SQL> select count(*) from TEST_TB1; ---------- SQL> select count(*) from TEST_TB2; ---------- 可以看到两张表均为空表,现在对两张表都进行move操作 SQL> alter table TEST_TB2 move; Table altered. SQL> alter table TEST_TB1 move; Table altered. 再看两张表所占用的空间 SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments where SEGMENT_NAME like 'TEST_TB%'; SEGMENT_NAME -------------------- ---------- TEST_TB1 TEST_TB2 为什么会这样,我们想到了空间分配问题,于是查看两表的DDL语句 SQL> set long 20000 SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','TEST_TB2') FROM USER_TABLES; DBMS_METADATA.GET_DDL('TABLE','TEST_TB2') -------------------------------------------------------------------------------- SQL> SELECT DBMS_METADATA.GET_DDL('TABLE','TEST_TB1') FROM USER_TABLES; DBMS_METADATA.GET_DDL('TABLE','TEST_TB1') -------------------------------------------------------------------------------- SQL> col SEGMENT_NAME format a20 SQL> select SEGMENT_NAME,BYTES/1024/1024 M from user_segments where SEGMENT_NAME like 'TEST_TB%'; SEGMENT_NAME -------------------- ---------- TEST_TB1 TEST_TB2 以上是全过程 转载:http://www.diybl.com/course/7_databases/oracle/oraclejs/2008923/145039.html
注意:move一张表之后索引和主键会失效,此时可以使用以下语句来进行恢复。 alter index index_name rebuild; |