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操作的影响以及区别我在索引帖子里面已经说到过。
oracle 大表在线删除列操作(alter table table_name set unused )的更多相关文章
- Oracle大表改为分区表及表空间切换方案
Oracle大表改为分区表及表空间切换方案 一. 背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分 ...
- oracle大表添加字段default经验分享
当oracle单表数据量上亿时,对表进行alter table aa add column_1 varchar2(2) defalut 'Y';时,效率及安全性是必须考虑的因素. 本帖以2亿的数据表a ...
- MySQL 大表在线DML神器--pt-online-schema-change
一个朋友问我在线对大表进行ddl操作,如何做能尽量避免主从延迟以及不影响在线dml操作呢?我想到一个开源的pt-online-schema-change工具,测试了吧,效果还可以. pt-online ...
- Oracle Drop表并未直接删除 drop table xx purge
drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通 ...
- Oracle之表的相关操作
#添加字段 格式: alter table table_name add column_name datatype; 例子: alter table userinfo ); desc userinfo ...
- mysql删除大表更快的drop table办法
mysql删除大表更快的drop table办法 参考资料:https://blog.csdn.net/anzhen0429/article/details/76284320 利用硬链接和trunca ...
- oracle 大表删除数据后,回收空间的问题。
在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理. 一般有一下几种方法: 1. 删除大部分数据,留下小部分数据.我们可以把需要保留的数据转移到别的表,然后再把大 ...
- Oracle数据库表空间常用操作
1. 查看所有表空间大小 SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tables ...
- oracle 大表 迅速 导出(使用命令行)
导出: exp dbname/dbpwd@orclname file=c:\xxx.dmp tables=(tablename) 导入:imp ross_delivery/123456@orcl fi ...
随机推荐
- Spring AOP开发时如何得到某个方法内调用的方法的代理对象?
Spring AOP开发时如何得到某个方法内调用的方法的代理对象? 问题阅读起来拗口,看代码 在方法中调用其他方法很常见,也经常使用,如果在一个方法内部调用其他方法,比如 public class U ...
- 端到端TVM编译器(上)
端到端TVM编译器(上) 摘要 将机器学习引入到各种各样的硬件设备中.AI框架依赖于特定于供应商的算子库,针对窄范围的服务器级gpu进行优化.将工作负载部署到新平台,例如手机.嵌入式设备和加速器(例如 ...
- python_request 使用jsonpath取值结果,进行接口关联
一.jsonpath的安装 pip install jsonpath 二.使用举例 import jsonpath d1={"token":"hjshdsjhdsj ...
- springcloud中 getway中的断言配置: Predicate 9中配置过程, getway的 filters实现限流功能:
https://www.cnblogs.com/grasp/p/11506426.html 这里引用别人的,,且试验过 ,没问题 server: port: 9527 spring: applicat ...
- pytest初始化与清除fixture(二)
@pytest.fixture用法 1.导入pytest模块:import pytest 2.调用装饰器函数:@pytest.fixture(callable_or_scope=None,*args, ...
- 使用ElementTree解析,操作xml
一.最近在实际工作中需要对一部分接口进行测试,接口的入参与出参都是xml格式的数据,所以用到了python内部模块ElementTree对xml进行解析,并根据实际需求操作xml数据 二.代码示例 # ...
- 【NX二次开发】打开信息窗口UF_UI_open_listing_window
头文件:uf_ui_ugopen.h函数名:UF_UI_open_listing_window 函数说明:打开信息窗口 测试代码: #include <uf.h> #include < ...
- 懒人 IDEA 插件推荐:EasyCode 一键帮你生成所需代码
Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. 1.安装(EasyCode) 我这里的 ...
- 终于明白为什么要加 final 关键字了
在开发过程中,由于习惯的原因,我们可能对某种编程语言的一些特性习以为常,特别是只用一种语言作为日常开发的情况.但是当你使用超过一种语言进行开发的时候就会发现,虽然都是高级语言,但是它们之间很多特性都是 ...
- 【模拟8.01】string(线段树)
因为题中只有a-z,所以区间中大量字母都是重复的,我们不妨利用桶的性质. 开一棵树,里面维护当前区间内的相同元素,若区间内元素不同,则为零 每次升序操作就先查询一遍区间,用桶将每个区间的a-z元素统计 ...