理解Oracle中delete, truncate与drop操作的区别及其影响
在Oracle数据库中,delete、truncate和drop是三种不同的数据操作,它们在处理数据和表结构方面有显著的区别: 1. **删除类型**: - `delete` 是Data Manipulation Language (DML)操作,它逐行删除数据,并保留在事务日志中的记录,允许回滚。在事务提交后,删除的数据才会永久消失。如果表上有触发器,`delete` 会触发它们。 - `truncate` 是DDL(Data Definition Language)操作,它一次性删除所有数据但保留表结构,不记录到事务日志,操作不可逆,且不会触发触发器。`truncate` 可能会释放数据空间,除非使用`REUSE STORAGE`选项。 - `drop` 是更为彻底的DDL操作,不仅删除表的所有数据和结构,还删除依赖于该表的对象,如索引、触发器等。默认情况下,Oracle有一个回收站机制,即使执行`drop`,数据可能会被移到一个较长名称的特殊位置。 2. **性能**: - 通常情况下,`drop` 操作最快,因为它跳过了记录和验证阶段;`truncate` 次之,因为它仅涉及数据本身;`delete` 最慢,因为涉及到记录和可能的触发器执行。 3. **回滚和安全性**: - `delete` 和 `truncate` 都可以部分回滚,只要事务未提交。`drop` 一旦执行,数据无法恢复,除非有备份。 - 对于有外键约束的表,`TRUNCATE TABLE` 不允许,必须使用`DELETE` 语句,且要确保数据完整性和事务一致性。 4. **空间管理**: - `truncate` 默认情况下会释放数据空间,`highwatermark` 移动到表的开头,而 `delete` 不会。 - 如果要清理表碎片并保留表结构,可以先使用 `TRUNCATE` 后加上 `REUSE STORAGE`,然后重新导入或插入数据。 5. **场景选择**: - 无事务关联且希望快速、完全清空表时,使用 `TRUNCATE`。 - 需要保留表结构并可能触发触发器时,使用 `DELETE`。 - 对于复杂的删除逻辑,可能需要结合事务处理,以防意外丢失数据。 总结来说,这三种操作各有优劣,选择哪种取决于具体的需求,包括数据完整性、事务处理、性能要求以及数据恢复的可能性。在执行这些操作前,务必谨慎考虑并确保有适当的数据备份策略。
1、truncate和delete只删除数据不删除表的结构(定义),而drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。
2、delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。
3、truncate,drop是ddl,操作立即生效,原数据不放到rollback segment中,不能回滚,操作不触发trigger。
4、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不动,truncate 语句缺省情况下将数据空间释放,除非使用reuse storage; truncate会将高水线复位(回到最开始),drop语句将表所占用的空间全部释放。
5、语句执行速度,一般来说: drop> truncate > delete
6、小心使用drop 和truncate,尤其没有备份的时候,想删除部分数据行用delete,注意带上where子句。
7、想保留表而将所有数据删除,如果和事务无关,用truncate即可,如果和事务有关,或者想触发trigger,还是用delete。
8、如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
9、对于由FOREIGN KEY 约束引用的表,不能使用TRUNCATE TABLE,而应使用不WHERE子句的DELETE语句。
另外,如果没有备份,drop,delete,truncate是否能够恢复?
从直观的感觉来说,似乎这个问题没什么含量,既然都已经drop,或者truncate了,是一个ddl语句,数据应该是回不来了,如果是delete,并且做了commit,数据也应该回不来了。
对于这个问题,至少从Oracle的角度来说,答案是可能,而且某些情况下是很可能。我们来一个一个分析:
首先是drop操作,在Oracle里面,默认情况下是有回收站的功能,就是把一个表做了drop操作之后,其实从物理上这个表并没有删除,而是简单换了一个很长的名字
如果回收站是开启的(默认开启)
SQL> show parameter recyclebin
NAME TYPE VALUE
---------- ------- ------
recyclebin string on
那么这个时候drop的表是否一定能够恢复呢,还是不一定,为什么,主要有几个原因可以考虑:
比如这个表所在的表空间资源紧张,很可能回收站里的这个表的数据就会被回收后存放其它的数据了;
或者说某个用户的配额(quota)本来就不足,这个时候也很可能使用回收站的资源就会受到限制;
或者说在某些场景下,你创建的表直接放在了system表空间下,这个时候哪怕空间充足,也是不能直接恢复回来的。
所以通过这些分析来看,drop操作还是有很多的可能,但是还是最开始的声明,是可能而不是肯定。
再来看看truncate操作,这个操作就算从数据恢复的角度来说,也是无能为力了。但是我们的答案还是可能,这个时候还是要说说flashback database这个特性了。
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 3
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦