SET UNUSED的用法





原理:清楚掉字典信息(撤消存储空间),不可恢复。



   可以使用 SET UNUSED选项标记一列或者多列不可用。



   使用DROP SET UNUSED选项删除被被标记为不可用的列。



语法:



   ALTER TABLE table SET UNUSED (COLlist多个)或者 ALTER TABLE table SET UNUSED COLUMN col单个;



   ALTER TABLE table DROP UNUSED COLUMNS;





set unused不会真地删除字段。

除了alter table drop field外,也可以

alter table set   unused field;

alter table drop unused;

set unused系统开销比较小,速度较快,所以可以先set unuased,然后在系统负载较小时,再drop。如系统负载不大,也可以直接drop。

不管用何种方法,都不会收回空间。





如果你有这个需求,要删除某一个表格上的某些栏位,但是由於这个表格拥有非常大量的资料,如果你在尖峰时间直接执行 ALTER TABLE ABC DROP(COLUMN);可能会收到 ORA-01562 - failed to extend rollback segment number string,

这是因为在这个删除栏位的过程中你可能会消耗光整个RBS,造成这样的错误出现,因此这样的做法并不是一个好方法,就算你拼命的加大RBS空间来应付这个问题,也不会是个好主意。



        我的建议做法:



        1>



        CREATE TABLE T1 (A NUMBER,B NUMBER);



        SQL> begin 2 for i in 1 …… 100000 3 loop 4 insert into t1 values(i,100);5 end loop;6 commit;7 end;



        SQL> select count(*) from t1;



        COUNT(*)



        100000



        2>



        SQL> ALTER TABLE T1 SET UNUSED COLUMN A CASCADE CONSTRAINTS;



        不要马上drop column,应该先set unused让column无法使用,避开系统尖峰时间再来处理删除栏位里的资料,要注意的是一但你set unused column,这个栏位是无法再回复使用的。



        3>



        重点来了,若你的栏位有一百万笔资料,我们应该避免一次写入那么多的undo log,所以我准备每删除一千笔资料就commit一次。



        SQL> alter table t1 drop unused columns checkpoint 1000;



        Table altered.



        在离峰的时间进行这样的动作,应该可以避免 ORA-01562的错误发生。

刚才有个人问我如何修复被设置为UNUSED的字段,我考虑了一下,以下的方法可以恢复(以下步骤执行前要做好备份),没有经验的DBA不要轻易尝试。

、创建实验表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;

、以下进行恢复



SQL> SELECT OBJ# FROM OBJ$ WHERE NAME='TTTA';

OBJ#

----------

     32067

SELECT COL#,INTCOL#,NAME FROM COL$ WHERE OBJ#=32067;

      COL#    INTCOL# NAME

---------- ---------- ------------------------------

         1          1 A

         2          2 B

         0          3 SYS_C00003_08031720:09:55$   被UNUSED的字段

         3          4 D

SQL> SELECT COLS FROM TAB$ WHERE OBJ#=32067;

COLS

----------

         3      ------字段数变为3了

SQL> UPDATE COL$ SET COL#=INTCOL# WHERE OBJ#=32067;

已更新4行。

SQL> UPDATE TAB$ SET COLS=COLS+1 WHERE OBJ#=32067;

已更新 1行。

UPDATE COL$ SET NAME='C' WHERE OBJ#=32067 AND COL#=3;

UPDATE COL$ SET PROPERTY=0 WHERE OBJ#=32067;

SQL> COMMIT;

、重启数据库

SQL> SELECT * FROM SCOTT.TTTA;

A          B C                   D

---------- ---------- ---------- ----------

         1          2 3                   4

         2          3 4                   5

恢复完成

Oracle SET UNUSED的用法的更多相关文章

  1. set unused的用法(ORACLE删除字段)

    set unused的用法(ORACLE删除字段) 一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用alter table1 drop (colu ...

  2. ORACLE删除字段(set unused的用法)

    一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用 alter table1 drop (column1,column2); 或者alter tab ...

  3. Oracle to_date()函数的用法

    Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...

  4. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  5. Oracle trunc()函数的用法

    Oracle trunc()函数的用法 /**************日期********************/1.select trunc(sysdate) from dual --2013-0 ...

  6. Oracle中group by用法

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组,一旦使用分组后select操作的对象变为各个分组后的数据,使用聚组函数返回的是每一个组的汇总 ...

  7. oracle之to_char,to_date用法

    [转载自]http://www.jb51.net/article/45591.htm 这篇文章主要介绍了oracle中to_date详细用法示例,包括期和字符转换函数用法.字符串和时间互转.求某天是星 ...

  8. oracle获取本月第一天和最后一天及Oracle trunc()函数的用法

    select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...

  9. oracle正则表达式regexp_like的用法详解

    oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...

随机推荐

  1. Openssl genpkey命令

    一.简介 genpkey命令用于产生各种密钥(RSA.DSA.DH.EC等)的私钥值. 二.语法 openssl genpkey [-out filename] [-outform PEM | DER ...

  2. ByteUnit

    JDK里面有TimeUnit,看spark源码有个ByteUnit.这个类还是挺不错的. public enum ByteUnit { BYTE (1), KiB (1024L), MiB ((lon ...

  3. CentOS7下源码包方式安装Erlang

    1.官网上下载源码包:OTP 19.1 Source File 2.把源码放在source目录中 , 解压 :tar -zxvf otp_src_19.1.tar.gz [或者 直接下载 rpm包 e ...

  4. [GO]结构体及普通变量初始化

    结构体是一种聚合的数据类型,它是由一系列相同类型或者不同类型的数据构成的数据集合,每个数据称为结构体的成员 1.结构体的初始化 package main import "fmt" ...

  5. Jmeter接口测试-新用户注册API

    新用户注册 新用户注册的接口是POST /register username/password/password_confirmation 该接口需要提供3个参数,分别是 username 用户名 p ...

  6. 三维GIS

    三维GIS数据结构 三维GIS数据库 三维渲染显示 点云处理 cnki:http://kns.cnki.net/kns/brief/default_result.aspx

  7. 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

    建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...

  8. Ubuntu的Unable to locate package无法更新源问题解决方案

    https://blog.csdn.net/long19910605/article/details/47017889/ 问题: 更新源时提示不能联网(does the network require ...

  9. 手机打车APP的机遇与挑战

    所谓打车APP,就是个能安装在手机上的打车软件.原理是通过GPS进行定位,能够搜索附近的空车信息然后反馈给用户.同样的,空车信息也会反馈给用户.一般这种啊APP都是跟地图类软件一起的.比如百度地图,谷 ...

  10. WPF 控件库——带有惯性的ScrollViewer

    WPF 控件库系列博文地址: WPF 控件库——仿制Chrome的ColorPicker WPF 控件库——仿制Windows10的进度条 WPF 控件库——轮播控件 WPF 控件库——带有惯性的Sc ...