以前知识: truncate和delete一样可以删除数据,但是truncate删除数据后不能进行数据的回滚,不会删除表结构。 delete删除数据后可以用rollback命令回滚删除的数据,delete不会删除表结构。 drop直接将表结构删除,相应数据也被删除。 重新认识: truncate语法:TRUNCATE TABLE[SCHEMA.] TABLE [{DROP|REUSE} STORAGE] 功能:删除整个表数据并释放空间,由于truncate是DDL命令,所以执行过程中原数据不会放在rollback segment 中,不会产生回滚数据,不产生redo log。 例子: A,B为两个TABLE A,B的数据分别放在test_data表空间下 A,B的索引分别放在test_index表空间下 那么我们使用下面的两个语句删除两个表中的数据 truncate table a drop storage;Truncate table b reuse storage;
truncate table a drop storage –data:数据部分所在的extent空间会释放(释放回收到minextents个extent),释放出来的空间可以允许其它segment使用 –index:B表的index部分数据删除,extent部分也被释放,剩下第一个extent。 –hwm:会将hwm重新设置到第一个block的位置(hwm会改变)
truncate table b reuse storage –data:数据部分所在的extent空间不被回收(仅仅是数据被删除),数据删除后的空间只能让本表使用,其它的segment不能使用此空间。 –index:B表的index部分数据删除,但是保留extent部分 –hwm:会将hwm重新设置到第一个block的位置(hwm会变)
小结: 使用truncate将会: 1清除相应索引(不是drop,仍然保留extent) 2受外键参考的约束。当然必须先disable或drop相应的外键参考,才能truncate 3不触发delete触发器 4若使用了drop storage(缺省),除了指定的minextents,其它extent重新分配next_extent设置 minextents之后的extent,high-water mark复位指向表中的第一个block。使用reuse storage保留表的使用 空间,保留原来的扩展但不合并,hwm(高水位)的位置reset到第一个block。当使用drop storage时将缩短表和表索引,将表收缩到最 小范围,并重新设置next参数。reuse storage不会缩短表或者调整next参数。另外一个区别是,用reuse storage 可以减少 对表及数据字典的锁定时间,特别是大表常这样做,余下和deallocateunused来逐步回收空间。 truncate语句缺省情况(缺省情况为drop storage)下空间将释放到minextents个extent,除非使用 reuse storage(如果是哦那个reuse storage,那么这么删除之后留下的空间会被保持);truncate会将高水位线复位(回到 最开始)。如果是整理表内部的碎片,可以用truncate跟上reuse storage再重新导入/插入数据。 delete语句不影响表所占用的extent,高水位线(high watermark)保持原位置不动。delete语句是DML,这个操作会放到rollback segment中,事务提交后才生效;如果有相应的trigger,执行的时候被触发。 drop语句将表所占用的空间全部释放。drop语句将删除表的结构被依赖的约束、触发器、索引;依赖于该表的存储过程/函数会被保留,状态变为invalid。
速度上,一般来说: drop> truncate > delete
posted on 2011-12-26 13:14 蓝红石 阅读( ...) 评论( ...) 编辑 收藏转载于:https://www.cnblogs.com/liuweihua/archive/2011/12/26/2301893.html