当前位置: 首页 > news >正文

Oracle DROP、TRUNCATE 和 DELETE 原理

在 Oracle 11g 中,DROPTRUNCATE 和 DELETE 是三种不同的数据清理操作,它们的底层原理和适用场景有显著差异

1. DELETE 的原理

类型:DML(数据操作语言)
功能:逐行删除表中符合条件的数据,保留表结构。
原理

  • 逐行操作:逐行标记删除,记录每行的删除操作到 undo 段(支持回滚)。

  • 事务性:需显式提交(COMMIT)或回滚(ROLLBACK),未提交前数据可恢复。

  • 高水位线(HWM):不降低表的 HWM,已删除数据占用的空间仍被表保留,后续插入可能重用这些空间。

  • 触发器触发:会触发 BEFORE DELETE 和 AFTER DELETE 触发器。

DELETE FROM employees WHERE department_id = 10;  -- 删除部门 10 的员工
ROLLBACK;  -- 可回滚

适用场景

  • 删除部分数据(带 WHERE 条件)。

  • 需要事务控制或触发器的场景。

注意事项

  • 性能问题:删除大量数据时生成大量 undo 日志 和 redo 日志,可能导致性能瓶颈。

  • 空间未释放:表占用的存储空间不会立即释放。

2. TRUNCATE 的原理

类型:DDL(数据定义语言)
功能:快速删除表中所有数据,保留表结构。
原理

  • 段级操作:直接释放表的 数据段(删除所有数据页),重置 HWM 为初始值。

  • 非事务性:隐式提交,不可回滚(执行后立即生效)。

  • 不记录日志:仅记录少量元数据操作日志(不记录每行删除的 undo/redo 日志)。

  • 不触发触发器:不会触发任何 DELETE 触发器。

TRUNCATE TABLE employees;  -- 清空表数据

适用场景

  • 快速清空大表所有数据。

  • 需要释放表占用的存储空间。

注意事项

  • 权限要求:需要 DROP ANY TABLE 权限。

  • 无法恢复:数据无法通过回滚恢复,需依赖备份。

  • 外键约束:若表是其他表的外键父表,需先禁用外键约束。

3. DROP 的原理

类型:DDL(数据定义语言)
功能:彻底删除表结构及数据,释放所有关联对象(索引、约束等)。
原理

  • 元数据删除:从数据字典(DBA_OBJECTSDBA_TABLES 等)中删除表的定义。

  • 段释放:释放表及其索引、LOB 列等占用的所有存储空间。

  • 非事务性:隐式提交,不可回滚。

DROP TABLE employees PURGE;  -- 彻底删除表(跳过回收站)

适用场景

  • 永久删除不再需要的表。

  • 清理测试环境中的临时表。

注意事项

  • 回收站机制:默认情况下,表会被移动到回收站(RECYCLEBIN),可通过 FLASHBACK TABLE 恢复。

  • 依赖对象:删除表时会级联删除索引、触发器等依赖对象。

三者的核心对比

特性DELETETRUNCATEDROP
操作类型DMLDDLDDL
事务支持支持回滚隐式提交,不可回滚隐式提交,不可回滚
日志生成生成大量 undo/redo 日志仅记录元数据日志仅记录元数据日志
性能慢(逐行操作)快(段级操作)快(元数据删除)
存储空间释放不释放(HWM 不变)释放(HWM 重置)完全释放
触发器触发触发不触发不触发
恢复方式事务回滚需备份恢复回收站或备份恢复
语法示例DELETE FROM table WHERETRUNCATE TABLE tableDROP TABLE table

4.如何选择?

  • 删除部分数据且需回滚 → DELETE

  • 快速清空大表所有数据 → TRUNCATE

  • 彻底删除表及结构 → DROP

注意事项

  • TRUNCATE 与分区表

    • 可针对单个分区操作:

      ALTER TABLE sales TRUNCATE PARTITION p2020;
  • DROP 的回收站机制

    • 恢复表:

      FLASHBACK TABLE employees TO BEFORE DROP;  -- 从回收站恢复
  • DELETE 的性能优化

    • 分批删除减少 undo 压力:

      BEGIN
        LOOP
          DELETE FROM employees WHERE department_id = 10 AND ROWNUM <= 10000;
          EXIT WHEN SQL%ROWCOUNT = 0;
          COMMIT;
        END LOOP;
      END;

相关文章:

  • SpringBoot实现随机生成10位数字和字母组合
  • Maven学习总结(61)—— Maven 依赖冲突检测及其解决方案
  • HTML5+CSS3小实例:纯CSS绘制七巧板
  • Deepseek解锁科研绘图新方式
  • MCU的USB接口作为 USB CDC串口输出
  • 猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
  • 【browser-use+deepseek】实现简单的web-ui自动化
  • 城电科技 | 探索光伏景观廊道:适用于零碳园区/公园/景区/校园/乡村长廊建设
  • MySQL NULL 值处理
  • Linux服务器安装百度飞桨3.0(pip docker)
  • OpenCV 物体追踪
  • 软件测试笔记(上)
  • 汉化进度100%
  • 高效解读机器语言,profinet转ethernet ip网关烟草企业自动化升级案例分析
  • Java设计模式全解析(共 23 种)
  • Redis与Lua原子操作深度解析及案例分析
  • 程序持续内存泄漏问题定位参考
  • 关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结
  • Java面试黄金宝典46
  • Web前端性能指标Web3D性能优化
  • 国外服务器做视频网站/seo技术网
  • 网站流量来源/seo学校
  • wordpress淘宝客 采集器/seo博客是什么意思
  • 网站建设的创新之处/关键词免费
  • 微信网站开发 js框架/seo在线网站推广
  • 公司网站建设南宁/网络营销的产品策略