Oracle move和shrink释放高水位空间(4)

---从上面可以看出,对表做了move后,该表实际占用的空间已经释放了,但是预分配的空间始终没有变化,这说明move操作会释放高水位以下的空间,但是不会释放高水位以上的空间;同时 test_1表的索引已经失效了!

6、对test_2表做shrink space操作:

SQL> alter table test_2 enable row movement;
Table altered.
SQL> alter table test_2 shrink space;
Table altered.
SQL> exec dbms_stats.gather_table_stats(ownname =>'ADMIN',tabname =>'TEST_2',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL> select B.SEGMENT_NAME, B.blocks,B.blocks * 8096 / 1024 / 1024, A.BLOCKS,A.blocks * 8096 / 1024 / 1024, A.EMPTY_BLOCKS from user_tables a,
  2            USER_SEGMENTS B WHERE TABLE_NAME in ('TEST_1','TEST_2') AND A.TABLE_NAME = B.SEGMENT_NAME;
SEGMENT_NAME                                                                          BLOCKS B.BLOCKS*8096/1024/1024    BLOCKS A.BLOCKS*8096/1024/1024 EMPTY_BLOCKS
--------------------------------------------------------------------------------- ---------- ----------------------- ---------- ----------------------- ------------
TEST_2                                                                                    40              .308837891          1              .007720947            0
TEST_1                                                                                64384              497.105469        35              .270233154            0
SQL>
SQL> select index_name,table_name,status from user_indexes where table_name='TEST_2';
INDEX_NAME                    TABLE_NAME                    STATUS
------------------------------ ------------------------------ --------
IDX_TEST2                      TEST_2                        VALID
SQL>

---从上面可以看出预分配的空间全部释放了,说明shrink space 同样会移动高水位,但也会释放申请的空间,是在高水位上下(below and above HWM)都有的操作,并且索引不会失效。

注意:

①:使用move时,会改变一些记录的ROWID,所以MOVE之后索引会变为无效,需要REBUILD。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/664d7b66bb730267d2e182d9535d0c68.html