为什么要使用set unused 删除列?
先总结一下set unused 这个语句的意思,在删除一个列在Oracle上有很多方式,一个是drop column另一个则是set unused。这两个是不一样的。
做一个试验:
SQL> create table t (a int ,b int , c int); Table created SQL> alter table t set unused column b; Table altered SQL> desc t; 名称 是否为空? 类型 ----------------------------------------- -------- -------------- A NUMBER(38) B NUMBER(38) C NUMBER(38) SQL> select object_id from user_objects where object_name='T'; OBJECT_ID ---------- 50580 SQL> select col#,name from sys.col$ where obj#=50580; COL# NAME ---------- ------------------------------ 1 A 0 SYS_C00002_06120202:02:00$ 2 C |
这里需要注意的事情是设置为unused的列并没有被真正意义的删除,只是在数据字典上加以标识,当我们将数据块上的数据转储出来会发现,数据还在,并没有被删除。而drop就不一样了。接着做
SQL> alter table t drop column c; Table altered SQL> select col#,name from sys.col$ where obj#=50580; COL# NAME ---------- ------------------------------ 1 A |
这时候可以看到列c已经被删除,不但是c而且b也被删除了。转储数据块上数据会发现数据也被删除了。
这里有一个疑问?
就是set unused的列能否被恢复。因为这里只是被在数据字典上设置为删除,而且数据还在,是否能够恢复,答案是不能够的,Oracle没有提供这个逆操作的命令,理论上是可行的,为什么不能被恢复,而且还是保留这么命令那?
这里主要是用于在删除具有大量数据的列的时候使用的。因为只有这样才能快速删除列,而不会对系统的性能产生影响。而后在系统闲暇的时候使用命令在删除数据。目的是在设置之后,这个列对于以后在操作是隐藏的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/222350/viewspace-913286/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/222350/viewspace-913286/