高效移除表中数据

问题描述
如何快速的从表中移除数据

解决方案
使用truncate或delete。truncate更快,但是有副作用。truncate是ddl语句,会自动提交,并且不能回滚。也不能在一个事物中truncate两张独立的表
truncate table computer_systems;
truncate之后,表只会剩下minextents定义的空间,其余空间会释放,如果不希望释放空间,使用
truncate table computer_systems reuse storage;
可以查询dba/all/user_extents验证空间是否被释放:
select count(*) fron user_extents where segment_name='COMPUTER_SYSTEMS';

工作原理
如果希望可以回滚或并不是清楚表中全部数据,应使用delete。使用delete会产生大量redo和undo。
truncate会使高水位线归零,delete不会使高水位线发生变化。truncate会提高全表扫描的性能,全表扫描会扫描高水位线的所有块。
truncate的另外一个副作用,如果表的主键被外键引用(即使子表没有数据),则不能truncate,会发生
02266, 00000, "unique/primary keys in table referenced by enabled foreign keys"
之所以不允许是因为,在truncate子表和父表的过程中,会有人往子表里添加数据
可以先禁用子表的外键约束,然后truncate,再启用约束

delete不会有这种限制,因为delete产生redo,提供读一致性
在delete过程中,可以查看v$transaction确认事物的细节,在事物结束前
insert into dept values(60,'tech','beijing');
select xidusn,xidsqn from v$transaction;
rollback;
select xidusn,xidsqn from v$transaction;

delete和truncate对比
delete:可提交或回滚,生成redo和undo,不影响高水位线,不受外键影响,大数据量性能缓慢
truncate:自动提交,产生少量redo,降低高水位线,有外键引用不能truncate,大数据量性能良好

另外一种清空数据的方法就是drop,create,不过只能在开发,测试环境使用,并且需要重建索引,触发器,权限,约束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值