关于truncate的记录

        在网上看到一片文章说truncate一张有100万条记录的表所用导入时间和delete一张有2条记录的一张表所用的时间差不多。当时的确十分的吃惊,于是在网上找了一下关于truncate的资料,看了半天,自己也来这写一下自己学到的东西.
        truncate 与delete drop有一定的区别。
        首先delete可以删除一张表的所有行记录,对表所占的空间没有影响,它不回收表之前的记录所占的extent,也不会降低HWM。
        其次drop是删除整一张表,包括表结构,索引,触发器,一致性键。删除了整个表包括表结构,也就是说这张表已经从数据库中消失了,也就不占空间,也没有HWM了。
        那么truncate并不删除表结构,它是用于清空表的。使用它清空表后,HVM会降低,有利于提高全表扫描的效率。但使用它是有一个条件的,即你要清空的表不能含有可用外键,如果存在可用外键,你想清空这种表,你必须先将外键置为disable状态。它分2种执行过程:
    1.truncate table table_name drop storage;
    2.truncate table table_name reuse storage;
使用这2中方法都做了以下共同的事情:
   1. 降低了hwm,让它等于第一个Blocks的位置。2.清空了表数据。3.对于索引,它的数据部分被删除,但是保留extent部分,也就是说索引的定义并没有删除。
但是使用drop 和 reuse的区别是:
drop 会回收并释放表数据所占的空间,回收后,表所占的空间为minextents个extent,回收释放后的空间可以供其他segment(表段)使用,它缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。
reuse 并不会回收表空间,它只是清空了表,这些空间仍然属于该表,而且只能由该表使用。它并未缩短表,也不用重新设置NEXT参数。

总结:truncate命令效率较高,它在清空表时不产生undo,redo日志(delete操作2者都会产生)。而使用reuse storage选项进行truncate表时,可以减少对表及数据字典的锁定时间,并且可以进行空间的整合。
            Delete 语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动 。 Delete语句是DML,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。
            Drop语句将表所占用的空间全部释放 。 drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态 。
        以上只是根据自身知识和网上资料进行整理的材料,用于自己遗忘时查看,如果有错误遗漏的地方,望请指正。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29227735/viewspace-1062568/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29227735/viewspace-1062568/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值