详解Oracle DELETE和TRUNCATE 的区别

 我来答
千锋教育
2018-08-01 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
展开全部
Oracle中truncate和delete的区别如下:
1、delete from后面可以写条件,truncate不可以。
2、delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少。
3、delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页。
4、当使用行锁执行DELETE语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
5、如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始。
6、truncate不会触发delete的触发器,因为truncate操作不记录各个行删除。

总结:
1、truncate和delete只删除数据不删除表的结构(定义)。
2、delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。
truncate是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
3、delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。
4、速度,一般来说: truncate > delete。
5、安全性:小心使用truncate,尤其没有备份的时候。
威孚半导体技术
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层... 点击进入详情页
本回答由威孚半导体技术提供
wackyer
2014-12-02 · TA获得超过928个赞
知道小有建树答主
回答量:605
采纳率:71%
帮助的人:384万
展开全部
从别处摘的。

1. DELETE
 ・DML语言
 ・可以回退
 ・可以有条件的删除

DELETE FROM 表名
  WHERE 条件

2.TRUNCATE TABLE
 ・DDL语言
 ・无法回退
 ・默认所有的表内容都删除
 ・删除速度比delete快。

TRUNCATE TABLE 表名
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
9iTreeNewBee
2014-12-02 · TA获得超过505个赞
知道小有建树答主
回答量:1800
采纳率:55%
帮助的人:422万
展开全部
delete 删的慢 写大量日志
truncate 删的快 写少量日志
SQL> select count(*) from test;

COUNT(*)
----------
2783488

Elapsed: 00:00:00.22
SQL> select count(*) from test1;

COUNT(*)
----------
2783488

Elapsed: 00:00:00.34
SQL> select object_name,object_id,data_object_id from dba_objects where object_name in ('TEST','TEST1');

OBJECT_NAM OBJECT_ID DATA_OBJECT_ID
---------- ---------- --------------
TEST1 88856 88856
TEST 88851 88851

Elapsed: 00:00:00.01
SQL> delete from test;

2783488 rows deleted.

Elapsed: 00:03:04.93

SQL> truncate table test1;

Table truncated.

Elapsed: 00:00:02.03
SQL> select object_name,object_id,data_object_id from dba_objects where object_name in ('TEST','TEST1');

OBJECT_NAM OBJECT_ID DATA_OBJECT_ID
---------- ---------- --------------
TEST1 88856 88857
TEST 88851 88851

Elapsed: 00:00:00.14
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shanyuanzz
2014-12-02 · 超过31用户采纳过TA的回答
知道答主
回答量:43
采纳率:100%
帮助的人:32.2万
展开全部
这个比较简单了,有很多地方不同,百度上一搜一堆。
大概说下
1、DELETE是逐行删除,所以在删除大量数据的时候速度慢,影响数据库效率;
TRUNCATE的话,是整表删掉(专业术语叫截短,截断),删除大量数据的时候有优势,不影响数据库运行效率。
2、DELETE触发行级触发器,T则不触发行级的触发器。
3、DELETE会做日志什么的bulabula之类的,这样可以在必要的时候回滚。T则没这么多规则,T了之后找不回来。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式