Oracle truncate table 与 delete tabel的区别

原创 2008年10月03日 21:04:00
 一、
1.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.
  
2.不从tablespace中腾出空间,需要
  
  ALTER TABLESPACE AAA COALESCE; 才有空间
  
3.truncate 调整high water mark 而delete不.truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)
  
  delete 则不可以。
  
4.truncate 只能对TABLE
  
  delete 可以是table,view,synonym
  
5.TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限
二、 truncate是DDL語言.
delete是DML語言

DDL語言是自動提交的.
命令完成就不可回滾.

truncate的速度也比delete要快得多.
三、 truncate 会把 highwatermark 回归至 0 ... 当下一次再插入新资料时就会快一些啦。

所以一般都是在 temp table 上使用的,不过要注意就是 truncate 不能在 pl/sql 上使用,要用 dynamic SQL 才可以。
四、
当你不再需要该表时, 用 drop;
当你仍要保留该表,但要删除所有记录时, 用 truncate;
当你要删除部分记录时(always with a WHERE clause), 用 delete.
五、
1.TRUNCATE TABLE
Index也會刪掉不是指drop index

sys@DEMO> create index tom.idx_object_name on tom.t(object_name);

已建立索引.

sys@DEMO> select block_id,bytes from dba_extents where segment_name=??IDX_OBJECT_NAME??;

BLOCK_ID BYTES
---------- ----------
17321 65536
17329 65536
17337 65536
17345 65536
17353 65536
17361 65536
17369 65536
17377 65536
17385 65536
17393 65536
17401 65536
17409 65536
41865 65536
41873 65536
41897 65536
41905 65536
18953 1048576
19081 1048576
19209 1048576
19337 1048576

已選取 20 個資料列.

sys@DEMO> TRUNCATE TABLE TOM.T;

表格被截斷.

sys@DEMO> select block_id,bytes from dba_extents where segment_name=??IDX_OBJECT_NAME??;

BLOCK_ID BYTES
---------- ----------
17321 65536

2.DELETE table
sys@DEMO> insert into tom.t select * from all_objects;

已建立 27747 個資料列.

sys@DEMO> insert into tom.t select * from all_objects;

已建立 27747 個資料列.

sys@DEMO> commit;

確認完成.

sys@DEMO> select block_id,bytes from dba_extents where segment_name=??IDX_OBJECT_NAME??;

BLOCK_ID BYTES
---------- ----------
17321 65536
17201 65536
17241 65536
17265 65536
17297 65536
17353 65536
17369 65536
17377 65536
17385 65536
17393 65536
17401 65536
17409 65536
41865 65536
41873 65536
41897 65536
41905 65536
17673 1048576
17801 1048576
18185 1048576
18441 1048576

已選取 20 個資料列.

sys@DEMO> delete from tom.t;

已刪除 55494 個資料列.

sys@DEMO> select block_id,bytes from dba_extents where segment_name=??IDX_OBJECT_NAME??;

BLOCK_ID BYTES
---------- ----------
17321 65536
17201 65536
17241 65536
17265 65536
17297 65536
17353 65536
17369 65536
17377 65536
17385 65536
17393 65536
17401 65536
17409 65536
41865 65536
41873 65536
41897 65536
41905 65536
17673 1048576
17801 1048576
18185 1048576
18441 1048576

已選取 20 個資料列.

本文转自
http://www.cnblogs.com/guodapeng/archive/2008/05/19/1202528.html

Oracle数据库中truncate命令和delete命令的区别

Oracle数据库中truncate命令和delete命令的区别 首先讲一下,truncate命令: 语法:TRUNCATE  TABLE  table; 表格里的数据被清空,存储空间被...
  • vevenlcf
  • vevenlcf
  • 2015年02月11日 11:35
  • 1022

数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较(举例说明)

转载来自: 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较(举例说明)   数据库删除语句的分别介绍: Delete:用于删除表中的行(注:可以...
  • shehun11
  • shehun11
  • 2014年10月24日 11:20
  • 1268

mysql中删除表记录delete from和truncate table的用法区别

mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法,一种是delete from语句,另一种是truncate table...
  • u013217071
  • u013217071
  • 2016年05月19日 12:03
  • 1755

数据库删除语句 Drop/Delete/Truncate比较

Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行)。 删除某一行:Delete from 数据表名称 where 列名称=值; 删除所有行:Dele...
  • dedecms8
  • dedecms8
  • 2016年09月11日 14:01
  • 1167

oracle数据库中truncate表后如何快速恢复

在生产中,极有可能遇到不小心truncate表的情况,truncate表后不会产生日志记录和回滚段空间的使用,不能用闪回恢复。尤其是在没有任何备份的情况下所以恢复起来相当麻烦,虽然在有备份的情况下是可...
  • tchic
  • tchic
  • 2016年09月12日 12:40
  • 7717

ORACLE 给用户授权truncate table 的实现方案

1,对其它用户下的表执行trundate table操作开发说在用dwetl下执行调用shop用户下的表的时候提示没有权限操作,google了查了下,发现oracle账户没法直接赋予对某个表的trun...
  • mchdba
  • mchdba
  • 2017年05月05日 16:43
  • 2691

Oracle中的Truncate和Delete语句(与索引的关系)

转载自: 首先讲一下,truncate命令:     语法:TRUNCATE  TABLE  table;   表格里的数据被清空,存储空间被释放。   运行...
  • l2tp1012
  • l2tp1012
  • 2014年06月13日 20:25
  • 2465

Truncate Table的时候不管是用drop storage 或reuse storage都会将HWM重新设置到第一

A, B 为两个Table . A, B 的数据分别放在 erp_data  表空间下  A, B 的索引分别放在 erp_indx 表空间下 那么 我们使用下面的两个语句删除两个表...
  • heizistudio
  • heizistudio
  • 2013年11月05日 15:43
  • 1762

很精辟的oracle高水位线,终于知道DELETE和TRUNCATE为什么不一样了

一、Oracle表段中的高水位线HWM 在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(H...
  • houdi2108
  • houdi2108
  • 2014年04月17日 10:48
  • 1975

Delete/Truncate删除,释放表空间、降低高水位线、resize释放磁盘空间相关优化

硬盘空间不足,打算删除数据库中的多余数据,但删除数据后,硬盘硬盘空间不能释放。 【delete后用:alter table table_name move    truncate后用:alter t...
  • vigor512
  • vigor512
  • 2013年11月20日 09:33
  • 1370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle truncate table 与 delete tabel的区别
举报原因:
原因补充:

(最多只允许输入30个字)