一
delete产生rollback如果删除大数据量的表速度会很慢同时会占用很多的rollback segments truncate 是DDL操作不产生rollback速度快一些
Truncate table does not generate rollback information and redo records so it is much faster than delete
In default it deallocates all space except the space allocated by MINEXTENTS unless you specify REUSE STORAGE clause
不从tablespace中腾出空间需要
ALTER TABLESPACE AAA COALESCE; 才有空间
truncate 调整high water mark 而delete不truncate之后TABLE的HWM退回到 INITIAL和NEXT的位置(默认)
delete 则不可以
truncate 只能对TABLE
delete 可以是tableviewsynonym
TRUNCATE TABLE 的对象必须是本模式下的或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的或被授予 DELETE ON SCHEMATABLE 或DELETE ANY TABLE的权限
二 truncate是DDL语言
delete是DML语言
DDL语言是自动提交的
命令完成就不可回滚
truncate的速度也比delete要快得多
三 truncate 会把 highwatermark 回归至 … 当下一次再插入新资料时就会快一些啦
所以一般都是在 temp table 上使用的不过要注意就是 truncate 不能在 pl/sql 上使用要用 dynamic SQL 才可以
四
当你不再需要该表时 用 drop;
当你仍要保留该表但要删除所有记录时 用 truncate;
当你要删除部分记录时(always with a WHERE clause) 用 delete
五
TRUNCATE TABLE
Index也会删掉不是指drop index
sys@DEMO> create index tomidx_object_name on tomt(object_name);
已建立索引
sys@DEMO> select block_idbytes from dba_extents where segment_name=IDX_OBJECT_NAME;
BLOCK_ID BYTES
——— ———
已选取 个资料列
sys@DEMO> TRUNCATE TABLE TOMT;
表格被截断
sys@DEMO> select block_idbytes from dba_extents where segment_name=IDX_OBJECT_NAME;
BLOCK_ID BYTES
——— ———
DELETE table
sys@DEMO> insert into tomt select * from all_objects;
已建立 个资料列
sys@DEMO> insert into tomt select * from all_objects;
已建立 个资料列
sys@DEMO> commit;
确认完成
sys@DEMO> select block_idbytes from dba_extents where segment_name=IDX_OBJECT_NAME;
BLOCK_ID BYTES
——— ———
已选取 个资料列
sys@DEMO> delete from tomt;
已删除 个资料列
sys@DEMO> select block_idbytes from dba_extents where segment_name=IDX_OBJECT_NAME;
BLOCK_ID BYTES
——— ———