LECT * FROM DBA_UNUSED_COL_TABS;
未选定行
SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS SET UNUSED(OBJECT_NAME);
表已更改。
SYS@orcl> SELECT * FROM DBA_UNUSED_COL_TABS;
OWNER? ? ? ? ? ? ? ? ? ? ? ? ? TABLE_NAME? ? ? ? ? ? ? ? ? ? ? ? ? COUNT
------------------------------ ------------------------------ ----------
SCOTT? ? ? ? ? ? ? ? ? ? ? ? ? TMP_ALL_OBJECTS? ? ? ? ? ? ? ? ? ? ? ? 1
SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks? ....................? ? ? ? ? ? ? 0
FS1 Blocks (0-25)? ....................? ? ? ? ? ? ? 0
FS2 Blocks (25-50)? ....................? ? ? ? ? ? ? 0
FS3 Blocks (50-75)? ....................? ? ? ? ? ? ? 0
FS4 Blocks (75-100) ....................? ? ? ? ? ? ? 0
Full Blocks? ? ? ? ....................? ? ? ? ? ? 352
Total Blocks ...........................? ? ? ? ? ? 384
Total Bytes? ...........................? ? ? 3,145,728
Total MBytes ...........................? ? ? ? ? ? ? 3
Unused Blocks...........................? ? ? ? ? ? ? 18
Unused Bytes ...........................? ? ? ? 147,456
Last Used Ext FileId....................? ? ? ? ? ? ? 4
Last Used Ext BlockId...................? ? ? ? ? 14,592
Last Used Block.........................? ? ? ? ? ? 110
PL/SQL 过程已成功完成。
--删除不可用列
SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS DROP UNUSED COLUMNS CHECKPOINT 250;
表已更改。
SYS@orcl> SELECT * FROM DBA_UNUSED_COL_TABS;
未选定行
SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks? ....................? ? ? ? ? ? ? 0
FS1 Blocks (0-25)? ....................? ? ? ? ? ? ? 0
FS2 Blocks (25-50)? ....................? ? ? ? ? ? ? 1
FS3 Blocks (50-75)? ....................? ? ? ? ? ? 350
FS4 Blocks (75-100) ....................? ? ? ? ? ? ? 1
Full Blocks? ? ? ? ....................? ? ? ? ? ? ? 0
Total Blocks ...........................? ? ? ? ? ? 384
Total Bytes? ...........................? ? ? 3,145,728
Total MBytes ...........................? ? ? ? ? ? ? 3
Unused Blocks...........................? ? ? ? ? ? ? 18
Unused Bytes ...........................? ? ? ? 147,456
Last Used Ext FileId....................? ? ? ? ? ? ? 4
Last Used Ext BlockId...................? ? ? ? ? 14,592
Last Used Block.........................? ? ? ? ? ? 110
PL/SQL 过程已成功完成。
--move操作,减少碎片
SCOTT@orcl> ALTER TABLE TMP_ALL_OBJECTS MOVE;
表已更改。
SYS@orcl> exec show_space('TMP_ALL_OBJECTS','SCOTT');
Unformatted Blocks? ....................? ? ? ? ? ? ? 0
FS1 Blocks (0-25)? ....................? ? ? ? ? ? ? 0
FS2 Blocks (25-50)? ....................? ? ? ? ? ? ? 0
FS3 Blocks (50-75)? ....................? ? ? ? ? ? ? 0
FS4 Blocks (75-100) ....................? ? ? ? ? ? ? 0
Full Blocks? ? ? ? ....................? ? ? ? ? ? 113
Total Blocks ...........................? ? ? ? ? ? 128
Total Bytes? ...........................? ? ? 1,048,576
Total MBytes ...........................? ? ? ? ? ? ? 1
Unused Blocks...........................? ? ? ? ? ? ? 5
Unused Bytes ...........................? ? ? ? ? 40,960
Last Used Ext FileId....................? ? ? ? ? ? ? 4
Last Used Ext BlockId...................? ? ? ? ? 14,808
Last Used Block.........................? ? ? ? ? ? ? 3
PL/SQL 过程已成功完成。
--可以看到总块数下降
--删除测试表
SCOTT@orcl> drop table TMP_ALL_OBJECTS;
表已删除。1
7、关于不可用列的恢复(以下摘自网络)
刚才有个人问我如何修复被设置为UNUSED的字段,我考虑了一下,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。
1、创建实验表TTTA
SQL> CREATE TABLE TTTA ( A INTEGER,B INTEGER,C VARCHAR2(10),D INTEGER);
表已创建。
SQL> INSERT INTO TTTA VALUES (1,2,'3',4);
已创建 1 行。
SQL> INSERT INTO TTTA VALUES (2,3,'4',5);
已创建 1 行。
SQL> COMMIT;
提交完成。
ALTER TABLE TTTA SET UNUSED COLUMN C;
2、以下进行恢复
SQL> SELECT OBJ#