oracle 大表在线删除列操作(alter table table_name set unused )

时间:2021-07-14
本文章向大家介绍oracle 大表在线删除列操作(alter table table_name set unused ),主要包括oracle 大表在线删除列操作(alter table table_name set unused )使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在某些情况下业务建的表某些列没有用到,需要进行删除,但是如果是数据量很大的大表,直接 alter table table_name drop column column_name;这种方法删除,那么将出现TM表锁,业务有可能hang住,所以不能这样子操作;Oracle 8i 引入了从表中删除列的能力。在此之前,有必要删除整个表并重建它。可以将列标记为未使用(逻辑删除)或完全删除(物理删除),下面介绍逻辑删除和物理删除。

一.逻辑删除

在大表上,物理删除列的过程非常耗时且耗费资源。决定从逻辑上删除最合适。实际上并未删除目标列数据或恢复这些列占用的磁盘空间。但是,标记为未使用的列不会显示在查询或数据字典视图中,并且会删除其名称,以便新列可以重用该名称。列上定义的所有约束、索引和统计信息也将被删除。

语法:

alter table table_name set unused (column_name);
alter table table_name set unused (column_name1, column_name2);

注意:set unused 语句是不可逆的操作,意思就是不能进行recover,除非你有备份。

完成此操作后,将不再看到这些列。如果以后您有时间物理删除列,可以使用以下方法完成。

alter table table_name drop unused columns;语句是对未使用的列唯一允许的操作。它从表中物理删除未使用的列并回收磁盘空间。
alter table table_name drop unused columns checkpoint XX;该子句导致在处理指定数量的行后应用检查点,在本例中为 1000。检查点减少了删除列操作期间累积的undo日志量,以避免undo空间的潜在耗尽。

DBA_UNUSED_COL_TABS 视图可用于查看每个表未使用的列数。

例如我需要删除user_order_detail 的DEL_IND,DEL_USER_ID,DEL_DTT这三列。

select count(*) from  user_order_detail ;

alter table user_order_detail set unused (DEL_IND,DEL_USER_ID,DEL_DTT); --这个执行是秒级别的非常快

select * from DBA_UNUSED_COL_TABS;

alter table user_order_detail drop unused columns checkpoint 1000; --这个执行看你的数据量,物理删除比较慢。从表中物理删除未使用的列并回收磁盘空间。

 可以想象,才200多万数据删除3列这么久,如果不是采用set unused 这种方法删除,直接物理删除千万甚至亿级别的数据,业务响应将是多么的可怕。

二.物理删除

 要物理删除列,您可以使用以下语法之一,具体取决于您希望删除单个列还是多个列。

alter table table_name drop column column_name;
alter table table_name drop (column_name1, column_name2);
同时,从表中删除一列将导致该表中所有未使用的列同时被删除(即有set unused 的列将被删除)
大表一般不用这种方法删除,对业务影响太严重,小表就可以这么操作,在及时性要求不高的情况下。

最后

如果删除列之后,即:

alter table table_name set unused (column_name);有进行alter table table_name move;操作,至于move 和shrink操作的影响以及区别我在索引帖子里面已经说到过。

原文地址:https://www.cnblogs.com/hmwh/p/15012610.html