问题描述
如何快速的从表中移除数据
解决方案
使用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,不过只能在开发,测试环境使用,并且需要重建索引,触发器,权限,约束
如何快速的从表中移除数据
解决方案
使用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,不过只能在开发,测试环境使用,并且需要重建索引,触发器,权限,约束