`
wwwzhouhui
  • 浏览: 361065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle delete 高水位线处理问题

 
阅读更多

    最近遇到oracle 表中数据量很大查询和更新比较慢 需要删除,发现删除后查询速度还是很慢,原来是delete oracle 高水位没有下降的原因。

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

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

    解决方案:

1.首先导出表,然后truncate这张表,最后导入这张表。

2.在存储空间当中移动表,但是由于rowid会被打乱,所以需要重建索引.

3.如果是oracle 10g.可是直接更新表的高水位线。

对应的SQL:

9i中:
create table aa_bak as select * from aa where record_time > sysdate - 10;
truncate table aa;
insert into aa select * from aa_bak;
drop table aa_bak;

10g 版本
alter tablename enable row movement;
alter tablename shrink space;

 实战:

  select count(*) from wlkp_fp_kj

  查询结果显示2301245 条记录

  我们需要删除一部分数据

  删除之前我们先查看表的高水位线(wlkp_fp_kj 是张分区表)

  SELECT segment_name, segment_type, blocks FROM dba_segments WHERE segment_name = 'WLKP_FP_KJ'

 


 

删除数据SQL

select count(*) from wlkp_fp_kj where  kprq<to_date('2011-12-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')
and kprq>to_date('2011-11-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')

 记录条数 54802 

删除语句

delete from wlkp_fp_kj where  kprq<to_date('2011-12-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')
and kprq>to_date('2011-11-01 14:00:00', 'yyyy-mm-dd,hh24:mi:ss')

 删除后查询WLKP_FP_KJ 表的高水位


 发现查询结果和上面没有删除之前一样没有变化。说明DELETE 语句高水位不会下降

我数据库10G 直接用方法二实现

执行如下语句:

alter table wlkp_fp_kj enable row movement; alter table wlkp_fp_kj shrink space;

  执行后结果在查询WLKP_FP_KJ的高水位



 很明显看到执行后高水位下降了。

 

  • 大小: 8.5 KB
  • 大小: 8.6 KB
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 3.2.4 索引范围扫描 72 3.2.5 索引全扫描 74 3.2.6 索引跳跃扫描 77 3.2.7 索引快速...

    oracle-sql

    对于那些需要保持事务一致性的场景,可能需要使用DELETE,尽管其速度较慢且可能导致高水位线不降。 总的来说,Oracle SQL提供了丰富的层次查询和数据清理工具,如SYS_CONNECT_BY_PATH、CONNECT_BY_ISLEAF、CONNECT_...

    Oracle 表的扫描方式及连接方法

    在做 Delete 操作的时候,即使把表中的数据都删掉了,高水位线不会降低,这样在做全表扫描的时候效率依然不会提高。 二、通过 ROWID 的表存取(Table Access by ROWID) 通过 ROWID 的表存取是 Oracle 存取单行...

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

    `TRUNCATE`作为DDL操作,仅改变数据文件中的高水位线(HWM),不使用回滚段,执行速度快;而`DELETE`作为DML操作,需经过回滚处理,消耗资源更多,执行时间较长。 ### 8. 索引的重要性 索引在Oracle数据库中扮演着...

    ORACLE经典学习笔记

    - TRUNCATE命令快速且无法回滚,它重置高水位线和所有索引;DELETE命令慢一些,但支持回滚。TRUNCATE不触发DELETE触发器,也不能授予他人清空表的权限。 #### 第二章 ORACLE 卸载 本章节讲述了如何卸载Oracle...

    oracle测试题

    - **高水位线影响**:`TRUNCATE` 会重置表的高水位线 (High Water Mark, HWM),这会影响后续插入数据时的空间分配策略;而 `DELETE` 不会改变 HWM。 #### 2. Oracle常用函数 - **字符串处理函数**: - `LENGTH()`...

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

    10. Oracle数据库高水位线(HWM):文档提到了HWM的概念,这是Oracle数据库中用来指示数据块中数据所占用的最高位置。HWM通常在删除表数据时不会下移,因此合理管理HWM可以避免磁盘空间浪费。 11. Oracle数据库的...

    Oracle数据块原理分析

    表目录区存储了数据块中所包含的数据表的相关信息,如表ID、高水位线等。这些信息对于管理和检索数据至关重要。 ##### 3. 行目录区(Row Directory) 行目录区记录了数据块中每一行数据的具体位置信息,即每个数据...

    Oracle经验技巧集(十年工作经历)

    `TRUNCATE`命令不仅能快速清空数据,还会重置高水位线,从而释放空间。 ### 4. HAVING子句的用法 **说明**:HAVING子句用于过滤GROUP BY子句产生的聚合行。与WHERE子句不同,HAVING子句可以包含聚合函数。例如,...

    开发高性能的ORACLE数据库SQL.doc

    在全表扫描的情况下,影响性能的关键因素是表的“高水位线”(High Water Mark, HWM)下的空间大小。HWM反映了表中最高数据占用的位置。即使删除了部分数据,HWM也不会自动收缩,导致扫描过程中读取了大量的空闲空间,...

    Oracle 大数据量操作优化.pdf

    7. **Direct-Path插入**:使用`/*+APPEND*/`提示进行直接路径插入,可以跳过常规的事务处理,直接在数据段的高水位线以上写入数据,提高插入速度。但是,这种方式不记录重做日志,可能影响恢复,且可能导致空间使用...

    Pass4side Oracle 1z0-033

    这是因为当执行 `DEALLOCATE UNUSED` 命令时,Oracle会尝试回收高水位线之后的未使用空间,但不会减少高水位线之前的已分配空间。 #### 知识点三:位图索引在DML操作下的性能退化原因 当对具有位图索引的表进行...

    ORACLE数据库工程师面试题目

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

    oracle面试问题

    - **TRUNCATE**:这是一种DDL操作,其作用仅仅是移动高水位线(High Water Mark, HWM),并清除所有行数据,但不会产生回滚段。因此,TRUNCATE执行速度更快,且不会占用大量的回滚段空间。 - **DELETE**:这是一项...

    Oracle9i模式对象.pptx

    High Water Mark 是 Oracle 9i 数据库中的一种机制,用于标记当前表的高水位线。可以通过查询 LAST_USED_EXTENT_FILE_ID, LAST_USED_EXTENT_BLOCK_ID, TOTAL_BLOCKS, UNUSED_BLOCK 等信息来找到 High Water Mark。

    oracle truncate恢复

    这是因为`TRUNCATE`会删除表的数据段并重置表的高水位线(High Water Mark, HWM),而不会记录每一行的删除动作到回滚段(因此不支持回滚)。此外,`TRUNCATE`不会触发任何触发器,进一步提高了执行效率。 #### 二、...

Global site tag (gtag.js) - Google Analytics