oracle truncate和delete 区别

Oracle中的TRUNCATE和DELETE操作在以下几个方面存在区别:

  1. 类型:TRUNCATE是DDL(数据定义语言)语句,而DELETE是DML(数据操纵语言)语句。
  2. 速度:TRUNCATE的速度通常远快于DELETE。当执行DELETE操作时,所有表数据先被COPY到回滚表空间,数据量的不同会导致花费的时间长短不一。而TRUNCATE是直接删除数据,不进回滚表空间。
  3. 回滚:DELETE操作的数据可以运行Rollback进行数据回滚。而TRUNCATE则是永久删除,不能回滚。
  4. 触发器:TRUNCATE操作不会触发表上的DELETE触发器,而DELETE会正常触发。
  5. 条件:TRUNCATE语句不能带WHERE条件,意味着只能进行全部数据的删除,而DELETE可以带WHERE条件进行局部数据的删除。
  6. 高水位线(High Water Mark):TRUNCATE操作会重置表的高水位线,而DELETE不会。
  7. 操作对象:TRUNCATE只能对TABLE进行操作,而DELETE可以是table、view、synonym。

总的来说,Oracle的TRUNCATE和DELETE操作在类型、速度、回滚、触发器、条件、高水位线和操作对象方面存在明显的区别。

日常操作中我们会很多的使用DELETE但是TRUNCATE提供DBA更加高效的操作方法

1. TRUNCATE的概述

在Oracle数据库中,TRUNCATE是一种用于删除表中所有数据的快速操作。与DELETE语句不同,TRUNCATE不会记录每一行的删除操作,而是直接释放表的存储空间。这使得TRUNCATE比DELETE更快,尤其是在处理大量数据时。

2. TRUNCATE的执行过程

TRUNCATE操作的执行过程主要包括以下几个步骤:

步骤1:获取表的排他锁

在执行TRUNCATE操作之前,需要获取表的排他锁,以确保没有其他会话对表进行并发操作。如果无法获取排他锁,TRUNCATE操作将被阻塞,直到锁可用。

步骤2:写入UNDO日志

在执行TRUNCATE操作之前,Oracle会将表的数据写入UNDO日志,以便在需要时进行回滚操作。UNDO日志记录了TRUNCATE操作之前表的所有数据。

步骤3:释放表的存储空间

TRUNCATE操作会直接释放表的存储空间,而不是逐行删除数据。这意味着TRUNCATE操作是一个DDL(数据定义语言)操作,它会更改表的结构而不是数据本身。

步骤4:更新数据字典

在TRUNCATE操作完成后,Oracle会更新数据字典中的相关元数据信息,包括表的统计信息和高水位标记。这些信息用于查询优化和空间管理。

步骤5:释放排他锁

最后,TRUNCATE操作释放表的排他锁,允许其他会话对表进行并发操作。

3. TRUNCATE的优点和注意事项

TRUNCATE操作相比于DELETE具有以下几个优点:

3.1 快速操作

TRUNCATE操作是一种快速的删除数据的方式,特别适用于大型表。由于TRUNCATE直接释放存储空间,而不记录每一行的删除操作,因此在处理大量数据时,TRUNCATE比DELETE更高效。

3.2 不生成UNDO日志

相比于DELETE操作,TRUNCATE操作不会生成大量的UNDO日志,因为它只需要记录表的元数据信息。这可以减少写入日志文件的开销,提高性能。

3.3 不会触发触发器

TRUNCATE操作不会触发与表相关的触发器。这可以避免触发器的执行过程,进一步提高性能。

但是,使用TRUNCATE操作时需要注意以下几点:

3.4 无法恢复数据

TRUNCATE操作会直接删除表中的所有数据,并且无法通过回滚操作来恢复。因此,在执行TRUNCATE操作之前,务必要确认数据备份的完整性。

3.5 不会重置表的ID

TRUNCATE操作不会重置表的自增ID(如果有)。如果需要重置ID,可以在TRUNCATE操作之后使用ALTER TABLE语句进行手动重置。

3.6 释放存储空间不会立即生效

尽管TRUNCATE操作会释放表的存储空间,但这些空间不会立即返回给操作系统。Oracle会将这些空间保留在表空间中,以便将来存储新数据。如果需要立即释放存储空间,可以使用ALTER TABLE语句的COMPRESS子句。

4. TRUNCATE与DELETE的比较

TRUNCATE和DELETE都可以用于删除表中的数据,但它们之间有很大的区别。

4.1 执行速度

TRUNCATE比DELETE更快,特别是在处理大量数据时。TRUNCATE直接释放存储空间,而不是逐行删除数据,因此速度更快。

4.2 日志记录

TRUNCATE不会记录每一行的删除操作,而DELETE会将每一行的删除操作记录在UNDO日志中。这意味着TRUNCATE不会生成大量的UNDO日志,可以减少日志文件的写入开销。

4.3 触发器触发

TRUNCATE不会触发与表相关的触发器,而DELETE会触发触发器。这可以避免触发器的执行过程,提高性能。

4.4 数据恢复

TRUNCATE操作无法通过回滚操作来恢复数据,而DELETE操作可以通过回滚操作来恢复被删除的数据。

4.5 存储空间释放

TRUNCATE操作会直接释放表的存储空间,但这些空间不会立即返回给操作系统。DELETE操作则会逐行删除数据,释放存储空间时会立即返回给操作系统。

5. 总结

TRUNCATE是一种用于快速删除表中所有数据的操作。它通过直接释放存储空间而不是逐行删除数据,提高了删除操作的效率。TRUNCATE操作不会记录每一行的删除操作,也不会触发与表相关的触发器。但需要注意的是,TRUNCATE操作无法恢复数据,也不会立即释放存储空间。因此,在使用TRUNCATE操作之前,务必要确认数据备份的完整性,并根据具体需求进行操作。

你可能感兴趣的:(oracle,数据库)