包虫病

首页 » 常识 » 诊断 » SQL不可用SETUNUSED
TUhjnbcbe - 2021/2/26 18:44:00
儿童白癜风的注意事项 http://disease.39.net/bjzkbdfyy/180612/6323898.html
描述

当一张表的字段不在需要的时候可以使用

altertableTABLE_NAMEdropcolumnCOLUMN_NAME;或altertableTABLE_NAMEdrop(COLUMN,COLUMN2);来删除多个列,但是不能删除一个表的所有列和sys表下的列

然而当使用dropcolumn的时候如果表中有大量数据,删除过程中会锁定表,并消耗大量时间,这个时候可以先将该列置为不可用(UNSUED)

altertableTABLE_NAMEsetunused(COLUMN,COLUMN2);此语句可同时将多列标记为unsued,但并不会真正删除该列,但是被标记为unused的列不会显示在select结果或数据字典视图中,在大多数情况下会连同列上所定义的索引、约束和统计信息一并删除,除非该列为LOB字段

可以使用altertabledropunsuedcolumns[checkpointCOUNT];来删除不可用的列并回收磁盘空间

在user_unused_col_tabs、all_unused_col_tabs、dba_unused_col_tabs中可以看到被标记为unused的所有表count字段中表示未使用列的数量,但是只能查看表的名称和被unused的数量,无法查看是哪一列被标为unused

对于外部表setunused将被转换成对应的drop语句

测试

创建两张一样的大表有W+条数据tb_big0和tb_big20

SQLcreatetabletb_big0asselect*fromdept;Tablecreated.SQLinsertintotb_big0select*fromtb_big0;4rowscreated.SQL/8rowscreated.…SQL/rowscreated.SQLcreatetabletb_big02asselect*fromtb_big0;Tablecreated.SQLselectcount(*)fromtb_big0;COUNT(*)----------SQLselectcount(*)fromtb_big02;COUNT(*)----------SQLdesctb_big0;NameNull?Type----------------------------------------------DEPTNONUMBER(2)DNAMEVARCHAR2(4)LOCVARCHAR2(3)SQLdesctb_big02;NameNull?Type----------------------------------------------DEPTNONUMBER(2)DNAMEVARCHAR2(4)LOCVARCHAR2(3)

打开执行时间并删除tb_big0的其中两列

SQLsettimeingonSQLaltertabletb_big0drop(DEPTNO,LOC);Tablealtered.Elapsed:00:0:39.86SQLdesctb_big0;NameNull?Type---------------------------------------------DNAMEVARCHAR2(4)SQLrollback;Rollback

1
查看完整版本: SQL不可用SETUNUSED