以前知识:
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