Truncate

由于经常要用到Truncate , delete, drop 等命令,但是可能还有一些同
学不是太了解操作过程中及之后数据库中数据结构的变化以及可能带来的后果,
所以在这里编写了一些相关的资料,写的比较凌乱.

语法:

TRUNCATE TABLE [schema.] table [{DROP | REUSE} STORAGE]

功能: 删除整个表的数据并释放空间
由于Truncate 是DDL 命令,所以执行过程中原数据不放在Rollback
Segment 中,不产生回滚数据 ,不产生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 ;
得到的结果将是(测试可以参考
http://www.itpub.net/showthread.php?threadid=588125&pagenumber= ):

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 参数。 REUSE
STORAGE 不会缩短表或者调整NEXT 参数。另外一个区别是,用reuse storage
可以减少对表及数据字典的锁定时间,特别是大表常这样做,余下和DEALLOCATE
UNUSED 来逐步回收空间。
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

你可能感兴趣的:(sql)