删除表中的数据的方法有delete,truncate,
它们都是删除表中的数据,而不能删除表结构,delete 可以删除整个表的数据也可以删除表中某一条或N条满足条件的数据,而truncate只能删除整个表的数据,一般我们把delete 操作收作删除表,而truncate操作叫作截断表.
truncate操作与delete操作对比
| 操作 | 回滚 | 高水线 | 空间 | 效率 |
| delete | 可以 | 不变 | 不回收 | 慢 |
下面分别用实例查看它们的不同
1.回滚
首先要明白两点
1.在oracle 中数据删除后还能回滚是因为它把原始数据放到了undo表空间,
2.DML语句使用undo表空间,DDL语句不使用undo,而delete是DML语句,truncate是DDL语句,别外DDL语句是隐式提交.
所以truncate操用不能回滚,而delete操作可以.
两种操作对比(首先新建一个表,并插入数据)
| 2 ( 4 ); SQL> insert into t values(10); Commit complete. I 10 |
Delete删除,然后回滚
| 1 row deleted. no rows selected SQL> rollback; SQL> select * from t; ---------- SQL> truncate table t; SQL> rollback; SQL> select * from t; SQL> analyze table t estimate statistics; SQL> select segment_name,blocks from dba_segments where segment_name=upper('t'); ------------------------------ ---------- SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); ------------------------------ ---------- ------------ SQL> delete from t; SQL> commit; SQL> analyze table t estimate statistics; SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); ------------------------------ ---------- ---------------------------------------------------------------- SQL> truncate table t; SQL> analyze table t estimate statistics; SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t'); ------------------------------ ---------- -------------------------------------------------------- SQL> set timing on; 2 for i in 1..100000 loop 4 commit; 6 end; PL/SQL procedure successfully completed. SQL> delete from t; Elapsed: 00:00:20.09 |
Truncate 截断表
| SQL> rollback; Elapsed: 00:00:17.36 COUNT(*) 100000 SQL> truncate table t; Elapsed: 00:00:00.20 |
可见删除同一个大小的表,delete用了20.09秒,而truncate只用了0.2秒.
本文对比了Oracle中truncate和delete操作的区别,包括回滚能力、高水线、空间利用和效率。通过实例展示了这两种操作在不同场景下的表现。

9941

被折叠的 条评论
为什么被折叠?



