`
哇哈哈852
  • 浏览: 94235 次
文章分类
社区版块
存档分类
最新评论

delete与truncate清空表数据对HWM的影响

阅读更多


在Oracle里,使用delete删除数据以后,数据库的存储容量不会减少,而且使用delete删除某个表的数据以后,查询这张表的速度和删除之前一样,不会发生变化。

因为oralce有一个HWM高水位标记(或者说高水位线),它是oracle的一个表使用空间最高水位线。当插入了数据以后,高水位线就会上涨,但是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。除非使用truncate删除数据。那么,这条高水位线在日常的增删操作中只会上涨,不会下跌,所以数据库容量也只会上升,不会下降。而使用select语句查询数据时,数据库会扫描高水位线以下的数据块,因为高水位线没有变化,所以扫描的时间不会减少,所以才会出现使用 delete删除数据以后,查询的速度还是和delete以前一样。

因此我们可以得出delete 并不会释放表空间,要释放表空间,需要使用truncate语句。
下面我们在测试一下。
1)创建测试表并插入测试数据;
SQL> CREATE TABLE w.w AS SELECT * FROM dba_objects;

Table created.
2)查看表中分配块,区大小;
SQL> SELECT segment_name, segment_type, blocks, extents FROM dba_segments WHERE segment_name = 'W';   ------segment_name的值一定要大些

SEGMENT_NAME                                      SEGMENT_TYPE         BLOCKS    EXTENTS
--------------------------------------------------------------------------------- ------------------ ---------- ----------
W                                          TABLE            4264       49
blocks列为分配数据块儿数,extents列为分配区块儿数
3)分析表w;
SQL> ANALYZE TABLE w ESTIMATE STATISTICS;

Table analyzed.
4)查询表高水位线;
SQL> SELECT blocks, empty_blocks, num_rows FROM USER_TABLES WHERE TABLE_NAME = 'W';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
      4214         50     294935
blocks列为高水位线(占用w表数据块儿数),empty_blocks列为表w空闲块儿数
5)现在将w表delete,在查看高水位线 【Linux公社 http://www.linuxidc.com 】
SQL> DELETE FROM w;

290232 rows deleted.

SQL> commit;

Commit complete.

SQL> ANALYZE TABLE w ESTIMATE STATISTICS;

Table analyzed.

SQL> SELECT blocks, empty_blocks, num_rows FROM USER_TABLES WHERE TABLE_NAME = 'W';

    BLOCKS EMPTY_BLOCKS   NUM_ROWS
---------- ------------ ----------
     4214         50      0                  ------高水位线并未下降,还是4214
  • 大小: 50.8 KB
分享到:
评论

相关推荐

    sql之truncate_、delete与drop区别.pdf

    - 当需要清空表中所有数据但保留表结构时,如果与事务无关或无需触发触发器,使用`TRUNCATE`更为合适。如果需要保留事务一致性或触发触发器,则应该使用`DELETE`。 ##### 6. 应用场景建议 - **删除部分数据行**:...

    delete,truncate和drop的区别

    - 当需要快速清空表中的所有数据而不关心事务时使用。 - 如果需要整理表内部的碎片并重新分配空间,可以先使用`truncate REUSE STORAGE`,然后再重新插入数据。 - **注意事项**: - 不适用于具有外键约束的表,...

    oracle truncate恢复

    在Oracle数据库管理中,`TRUNCATE`命令是一种高效的数据清除方式,常用于快速清空表中的所有数据。然而,与`DELETE`语句不同的是,`TRUNCATE`操作是非事务性的且无法通过普通的ROLLBACK机制撤销。因此,在执行`...

    Oracle.表与锁

    在删除大量数据时,使用`DELETE`会保留HWM,而`TRUNCATE`则会重置HWM,但需要注意`TRUNCATE`无法回滚且会释放表空间,适用于清空整个表的情况。 在数据块的存储结构方面,数据块由头部和可用空间组成,头部包含了...

    oracle测试题

    - **性质差异**:`TRUNCATE` 是一种 DDL(数据定义语言)语句,主要用于快速清空表中的数据;而 `DELETE` 是一种 DML(数据操纵语言)语句,用于根据特定条件删除表中的记录。 - **执行效率**:`TRUNCATE` 的执行...

    oracle-sql

    TRUNCATE是Oracle中用于快速清空表数据的DDL命令。与DELETE不同,它不记录单行删除,因此速度更快且不可回滚。TRUNCATE不会触发删除触发器,不保留ROLLBACK段,且会重置表的高水位线(HWM),释放表空间。但需要...

    个人收集的oracle面试题目.pdf

    14. Oracle数据库段管理:文档中提到了delete segment(删除段)和truncate(截断),这是两种不同的数据库对象管理操作,其中truncate用于快速清空表中的数据。 通过上述知识点,可以了解到Oracle数据库在面试中的...

    Oracle降低高水位的方法

    - **功能**:该命令可以直接清空表并释放空间,但需要注意的是,这会删除所有数据,并且无法通过事务回滚来恢复数据。 - **适用场景**:适用于不再需要表中现有数据的情况。 3. **使用`ALTER TABLE <table_name> ...

    最新JAVA面试题总结之数据库.docx

    delete 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作记录在日志中,以便进行回滚操作,不清空 AUTO_INCREMENT 记录数;truncate 则直接将表删除并重新建表,不会把单独的删除操作记录记入日志...

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

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

    ORACLE数据库工程师面试题目

    - **TRUNCATE**:这是一个DDL操作,用于清空表中的所有数据,同时会重置高水位线(HWM),无需回滚段参与,速度快。 - **DELETE**:这是一个DML操作,逐行删除表中的记录,需要回滚段参与,速度相对较慢。 #### 八...

    oracle面试题

    - `TRUNCATE`: 是一种DDL(数据定义语言)操作,用于快速清空表中的所有数据。它移动高水位线(High Water Mark, HWM),并不需要回滚段(Rollback Segment)。`TRUNCATE`操作无法通过回滚来撤销,速度较快。 - `...

    DBA面试题详解

    - **TRUNCATE**: 是DDL操作,清空表中的所有记录,同时移动高水位线(HWM),不需要回滚段。 - **DELETE**: 是DML操作,同样可以删除表中所有记录,但需要回滚段,处理时间较长。 **8. 索引的作用** - **目的**: ...

    亚太面试总结

    - **Truncate**:属于DDL(Data Definition Language)操作,用于快速清空表中的所有数据。它通过移动高水位标记(HWM)来达到清除数据的目的,不保留任何事务日志,因此速度非常快。 - **Delete**:属于DML(Data ...

Global site tag (gtag.js) - Google Analytics