delete/truncate/drop

来源:互联网 发布:dnf特级职业转换书淘宝 编辑:程序博客网 时间:2024/04/28 02:48

---truncate
truncate table aa;
truncate通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
truncate速度快,使用的系统和事务日志资源少。
truncate不触发任何delete触发器。
truncate是DDL语句进行隐式提交,不能进行回滚操作。
truncate将重新设置高水平线和所有的索引,将高水线复位(回到最开始)。
truncate只删除整张表的数据但不删除表的结构,删完之后的表就是刚建表的状态,当表被被truncate后,这个表和索引所占用的空间会恢复到初始大小。
truncate删除数据(缺省情况下)释放空间到minextents个extent,除非使用reuse storage。
truncate的表不会放入recyclebin.

---delete
delete from aa(where ……);
delete只删除数据不删除表的结构,delete删除数据不释放空间,数据库的存储容量不会减少,delete操作不会减少表或索引所占用的空间,delete语句不影响表占用的数据块。
delete from记录是一条条删除的,所删除的每行记录都会进日志。
delete会产生回滚信息来满足回滚需求,将原始数据放到了undo表空间(DML)。

---drop
drop  table aa;
drop用来删除表定义及其数据,将表所占用的空间全部释放。
drop将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。
drop操作立即生效,原数据不放到回滚段中,不能回滚,操作不触发trigger.
drop是DDL语句,执行后会自动提交。


delete/truncate/drop

---delete和truncate的区别
  操作       回滚      高水线      空间      效率 
truncate    不能       降低         回收       快 
delete         能         不变       不回收     慢 

----高水线
所有Oracle都有一个容纳数据的上限。称之为high water mark(HVM),HVM通常增长幅度为5个数据块。高水线是oracle的一个表使用空间最高水位线,当插入了数据以后。高水位线就会上涨。

----速度:drop>truncate>delete

----使用:
删除部分行:用delete,注意要带上where子句,回滚段要足够大。
删除表:用drop
保留表但是删除数据:(1)和事务无关,用truncate
                                    (2)和事务有关或想触发trigger,用delete
整理表内部的碎片:用truncate跟上reuse stroage再重新导入/插入数据。

----总结:delete和truncate只删除表中数据,而drop删除表。

----使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。
原因:用delete删除数据,数据虽然被删除了,但高水位线却没有降低。而使用select语句查询数据时,数据库会扫描水位线以下的数据块,因为水位线没有变化,所以扫描的时间不会减少。

----truncate将重新设置高水平线和所有的索引,将高水线复位
由于全表扫描和索引快速扫描都要读取所有的数据块直到HVM为止,所以经过truncate操作后全表扫描性能会提高。

---delete和truncate删除数据,而drop删除表

注意:truncate table 后,有可能表空间仍没有释放,可以使用如下语句:
alter table YY0A.T_OM_WORKLIST_PROP_INFO_HIS deallocate   UNUSED KEEP 0;注意如果不加KEEP 0的话,表空间是不会释放的。

0 0
原创粉丝点击