`

实例对比Oracle中truncate和delete的区别

 
阅读更多
实例对比Oracle中truncate和delete的区别
删除表中的数据的方法有delete,truncate,
它们都是删除表中的数据,而不能删除表结构,delete 可以删除整个表的数据也可以删除表中某一条或N条满足条件的数据,而truncate只能删除整个表的数据,一般我们把delete 操作收作删除表,而truncate操作叫作截断表.
truncate操作与delete操作对比操作 回滚 高水线 空间 效率
Truncate 不能 下降 回收 快
delete 可以 不变 不回收 慢


下面分别用实例查看它们的不同
1.回滚
首先要明白两点
1.在oracle 中数据删除后还能回滚是因为它把原始数据放到了undo表空间,
2.DML语句使用undo表空间,DDL语句不使用undo,而delete是DML语句,truncate是DDL语句,别外DDL语句是隐式提交.
所以truncate操用不能回滚,而delete操作可以.
两种操作对比(首先新建一个表,并插入数据)
SQL> create table t
  2  (
  3  i number  4  );
Table created.
SQL> insert into t values(10);SQL> commit;Commit complete.SQL> select * from t;         I----------        10

Delete删除,然后回滚
SQL> delete from t;
1 row deleted.
SQL> select * from t;
no rows selected
#删除后回滚SQL> rollback;
Rollback complete.
SQL> select * from t;
         I
----------
        10

Truncate截断表,然后回滚.
SQL> truncate table t;
Table truncated.
SQL> rollback;
Rollback complete.
SQL> select * from t;
no rows selected

可见delete删除表还可以回滚,而truncate截断表就不能回滚了.(前提是delete操作没有提交)
2.高水线
所有的Oracle表都有一个容纳数据的上限(很象一个水库历史最高的水位),我们把这个上限称为“high water mark”或HWM。这个HWM是一个标记(专门有一个数据块用来记录高水标记等),用来说明已经有多少数据块分配给这个表. HWM通常增长的幅度为一次5个数据块.
delete语句不影响表所占用的数据块, 高水线(high watermark)保持原位置不动
truncate 语句缺省情况下空间释放,除非使用reuse storage;   truncate会将高水线复位
下面对两种操作对比
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select segment_name,blocks from dba_segments where segment_name=upper('t');
SEGMENT_NAME                       BLOCKS
------------------------------ ----------
T                                      24
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ------------
T                                      20            3

USER_TABLES.BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。注意:USER_TABLES.BLOCKS EMPTY_BLOCKS (20+3=23)比DBA_SEGMENTS.BLOCKS少一个数据库块,这是因为有一个数据库块被保留用作表头。DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS表示已经使用过的数据库块的数目(水线)。
Delete删除表,
SQL> delete from t;
10000 rows deletedSQL> commit;Commit complete.SQL> analyze table t estimate statistics;Table analyzed.SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- ----------------------------------------------------------------T                                      20            3

Truncate截断表
SQL> truncate table t;
Table truncated.
SQL> analyze table t estimate statistics;
Table analyzed.
SQL> select table_name,blocks,empty_blocks from user_tables where table_name=upper('t');
TABLE_NAME                         BLOCKS EMPTY_BLOCKS
------------------------------ ---------- --------------------------------------------------------
T                                       0            7

可见,delete表,BLOCK(高水线)不变,而truncate表BLOCKS(高水线)变为0
现在我们也看到blocks+empty_blocks=7,也就是oracle分配区时默认一次7+1(表头)=8个blocks;
高水线的作用: HWM对数据库的操作有如下影响:
a) 全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据。
b) 即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
因此高水线是oracle优化时一个重要的参数
3.空间
既然高水线用来说明已经有多少数据块分配给这个表,那么高水线也可理解为表的空间占用。
即使delete将表中的数据全部删除,HWM还是为原值,所以还有那么多的空间分配给这个表,即它的空间还没有回收,
而truncate表后高水线变为0,那现在它就表示没有分配空间,即它的空间被回收了。
4.效率
要想查看delete,truncate那个效率更高,先构建一个大表,然后查看它们分别对些表删除所需的时间。
有个相当形象的比喻:领导给你两本书让你扔掉,delete就是你守在复印机前,把书一页页撕下来复印一份,再一页页扔到垃圾桶里,truncate就是直接把两本书扔到垃圾桶里,那个快那个慢不言而喻。
先在表中插入100000条记录,并打开时间
SQL> set timing on;SQL> begin  2  for i in 1..100000 loop  3  insert into t values('10');  4  commit;  5  end loop;  6  end;  7  /PL/SQL procedure successfully completed.Elapsed: 00:01:12.50

Delete删除表
SQL> delete from t;
100000 rows deleted.
Elapsed: 00:00:20.09

Truncate 截断表
#先把表回滚SQL> rollback;Rollback complete.Elapsed: 00:00:17.36SQL> select count(*) from t;  COUNT(*)-------------------    100000Elapsed: 00:00:00.01SQL> truncate table t;Table truncated.Elapsed: 00:00:00.20

可见删除同一个大小的表,delete用了20.09秒,而truncate只用了0.2秒.本文出自 “追求” 博客,请务必保留此出处http://chenxy.blog.51cto.com/729966/168459
分享到:
评论

相关推荐

    oracle中truncate table后的数据恢复

    在Oracle数据库中,`TRUNCATE TABLE`是一个用于删除表中所有数据的命令,它与`DELETE`语句不同,不记录任何删除操作,并且在大多数情况下执行速度更快。然而,一旦执行`TRUNCATE TABLE`,数据通常无法通过常规的...

    oracle面试题集锦

    本文将从多个方面对 oracle 的知识点进行总结,包括查找部门的前 2 名、事务概念、触发器的作用、实现索引的方式、view 的概念、 truncate 和 delete 的区别、数据库启动与关闭的步骤、删除重复记录、授予权限等。...

    truncate 表恢复

    `TRUNCATE`命令在Oracle数据库中用于快速清空表中的所有数据。与`DELETE`命令不同的是,`TRUNCATE`不触发任何触发器也不记录回滚信息,因此执行速度更快。具体来说,`TRUNCATE`操作的原理在于它**并不会逐个清除用户...

    oracle创建触发器实例

    在这个实例中,我们看到的是一个防止非本地机器执行DDL(Data Definition Language)操作的触发器,比如`TRUNCATE`、`ALTER`或`DROP`等。这个触发器主要目的是为了系统安全和审计目的。 首先,为了创建这个触发器,...

    oracle面试题目

    在处理数据时,TRUNCATE和DELETE命令都可以用来删除表中的所有记录,但它们属于不同的SQL命令类型:TRUNCATE是DDL,而DELETE是DML。TRUNCATE操作速度更快,因为它不需要rollback segment且一般不触发触发器,但不能...

    Oracle面试题常见的问题

    truncate 和 delete 都可以用来删除表中所有的记录。区别在于:truncate 是 DDL 操作,它移动 HWK,不需要 rollback segment .而 Delete 是 DML 操作, 需要 rollback segment 且花费较长时间. 8. 使用索引的理由 ...

    ORACLE常用语法

    同时,学会使用TRUNCATE和DELETE的区别,以及如何使用ALTER TABLE修改表结构。 4. **视图**:视图是从一个或多个表中创建的虚拟表,可以简化复杂的查询和提供数据的安全性。理解视图的创建、更新和删除操作。 在...

    Oracle数据库DBA面试题50道及答案.pdf

    7. **truncate和delete命令的比较**: - **truncate**:DDL操作,不记录详细操作日志,删除速度快。 - **delete**:DML操作,需要rollback segment,删除速度较慢。 8. **STAR SCHEMA的表及其数据**: - **Fact ...

    Oracle面试题集锦

    4. **数据块、扩展和段的区别**:数据块是Oracle存储的最小单位,扩展是一系列连续的数据块,用于满足更大存储需求;段则是相同类型对象(如表或索引)的所有扩展的集合。 5. **检查表结构**:使用`DESCRIBE`命令或...

    ORACLE经典学习笔记

    - 需要在本地磁盘中找到Oracle相关的文件和文件夹进行手动删除,特别是`C:\Program Files\Oracle`目录下的内容。 4. **清理注册表**: - 使用注册表编辑器(regedit)清理Oracle相关的注册表项,例如在`Hkey_...

    超详细ORACLE培训带实例带书签目录

    - **Oracle实例与数据库**:区分Oracle实例和数据库的概念。 - **内存结构**:SGA和PGA的组成及其作用。 - **后台进程**:PMON、SMON等后台进程的功能。 - **文件结构**:数据文件、日志文件、控制文件等。 #### 第...

    关于ORACLE面试题

    在Oracle数据库中,表空间(Tablespace)是逻辑存储单元,用于组织和管理数据库中的数据。一个表空间可以包含多个数据文件(Datafile),而一个数据文件只能属于一个表空间。 - **表空间的类型**: - **永久表空间...

    oracle常见面试题及答案.pdf

    答案:TRUNCATE和DELETE都可以用来删除表中所有的记录。TRUNCATE是DDL命令,不需要rollback segment,而DELETE是DML命令,需要rollback segment且花费较长时间。 7. 数据相关约束类型有哪些? 答案:主键约束、...

    oracle面试题集锦.pdf

    20. $ORACLE_HOME 和 $ORACLE_BASE 的区别: ORACLE_BASE 是 oracle 的根目录,ORACLE_HOME 是 oracle 产品的目录。 21. 判断数据库时区的方法: 可以使用 SELECT DBTIMEZONE FROM DUAL; 命令来判断数据库时区。 ...

    oracle安装-卸载-初识oracle-笔记

    卸载Oracle时需谨慎操作,确保先停止所有Oracle服务,然后通过控制面板或专门的卸载工具逐个移除组件,包括数据库实例、客户端和服务。 第二部分,我们来看看Oracle的基本内容: 一、Oracle表的管理(创建和维护)...

    oracle常见面试题及答案

    6. 比较 truncate 和 delete 命令有什么区别? 答:两者都可以用来删除表中所有的记录。区别在于:truncate 是 DDL(数据定义语言),它移动 HWK,不需要 rollback segment(处理事务回滚操作);delete 是 DML...

    讲解Oracle面试过程中常见的二十个问题

    尽管`TRUNCATE`和`DELETE`都能清空表中的所有记录,但两者的机制不同。`TRUNCATE`作为DDL操作,仅改变数据文件中的高水位线(HWM),不使用回滚段,执行速度快;而`DELETE`作为DML操作,需经过回滚处理,消耗资源更...

    ORACLE面试500题

    【Oracle面试500题解析】 1. **冷备份与热备份**: ...以上是对Oracle面试题中部分知识点的详细解释,涵盖了数据库备份、恢复、表结构、索引、性能优化等多个方面,有助于理解Oracle数据库的核心概念和技术。

    oracle临时表(事务级、会话级).docx

    3. 当一个会话结束(用户正常退出、用户不正常退出、Oracle 实例崩溃)或者一个事务结束的时候,Oracle 对这个会话的表执行 TRUNCATE 语句清空临时表数据。但不会清空其它会话临时表中的数据。 4. 你可以索引临时表...

Global site tag (gtag.js) - Google Analytics