Truncate Table介绍
由于经常要用到Truncate、delete、drop等命令,但是可能还有一些同学不是太了解操作过程中及之后数据库中数据结构的变化以及可能带来的后果,所以在这里编写了一些相关的资料,写的比较凌乱,不过重要的知识点基本涉及到了,希望对各位同学有帮助,有不妥的地方望指正。
语法:TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]
功能:删除整个表的数据并释放空间
由于Truncate是DDL命令,所以执行过程中原数据不放在RollbackSegment中,不产生回滚数据,不产生Redo Log。
Truncate、Drop等DDL命令都是隐含提交的。
例子:
A、B 为两个Table
A、B 的数据分别放在 erp_data 表空间下
A、B 的索引分别放在 erp_indx 表空间下
那么我们使用下面的两个语句删除两个表中的数据
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空间不会被回收(仅仅数据会被删除),数据删除之后的freespace空间只能供本表使用,不可以供其它segment使用。
--index : B表的index部分会数据删除,但是保留extent部分。
--hwm : 会将HWM重新设置到第一个Block的位置(hwm 会改变)。
小结:
使用Truncate将会:
1、清除相应索引(不是Drop,仍然保留extent);
2、受外键参考的约束(FOREIGN KEY)。当然必须先DISABLE或DROP相应的外键参考,才能TRUNCATE,注意没有CASCADE选项;
3、不触发DELETE触发器
4、若使用了DROP STORAGE(缺省), 除了已指定的MINEXTENTS,其它EXTENT 重新分配NEXT_EXTENT 设置MINEXTENTS 之后的EXTENT,High-Water Mark 复位指向表中的第一个BLOCK。 使用REUSE STORAGE 保留表的使用空间 ,保留原来的扩展,但不合并; HWM(高水位)的位置RESET 到第一个BLOCK。 当使DROP STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT 参数。 REUSESTORAGE 不会缩短表或者调整NEXT 参数。另外一个区别是,用reuse storage可以减少对表及数据字典的锁定时间,特别是大表常这样做,余下和DEALLOCATEUNUSED 来逐步回收空间。Truncate 语句缺省情况(缺省情况为drop storage)下空间释放到 minextents个 extent, 除非使用reuse storage (如果使用reuse storage,那么这些删除之后留下的空间会被保持);Truncate 会将高水线复位(回到最开始)。 如果是整理表内部的碎片,可以用truncate 跟上reuse stroage,再重新导入/插入数据。Delete 语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动 。 Delete 语句是DML,这个操作会放到rollback segement 中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。Drop 语句将表所占用的空间全部释放。drop 语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid 状态。
速度上,一般来说: drop> truncate > delete