当一张表的字段不在需要的时候可以使用
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