数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracletruncatetable与deletetabel的区别


发布日期:2020年12月26日
 
Oracletruncatetable与deletetabel的区别

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

——— ———

上一篇:oracle中的单引号和双引号

下一篇:Oracle数据库游标使用大全