`
luogen33
  • 浏览: 82642 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

oracle中高水位线问题解决方法

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

解决方案:
1.首先导出表,然后truncate这张表,最后导入这张表。
2.在存储空间当中移动表,但是由于rowid会被打乱,所以需要重建索引.
3.如果是oracle 10g.可是直接更新表的高水位线。
对应的SQL:


-------------------------- oracle 9i高水位线解决 ----------------------

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;

-------------------------- oracle 10g高水位线解决 ----------------------
10g 版本
alter tablename enable row movement;
alter tablename shrink space;

1.释放水平线的存储过程
create or replace procedure proc_delete_leave is
begin
  execute immediate ' alter table test enable row movement';
  execute immediate ' alter table test  shrink space';
end proc_delete_leave;

2 . 调用存储过程的job.
declare
  x NUMBER := 1000;
begin
  SYS.DBMS_JOB.SUBMIT(job       => x,
                      what      => 'proc_delete_leave;', --存储过程名称  
                      next_date => trunc(sysdate + 5 / 1440, 'MI'), --下次执行时间  
                      interval  => 'trunc(sysdate+1440/1440,''MI'')', --间隔时间  
                      no_parse  => FALSE);
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
  COMMIT;
end;
分享到:
评论

相关推荐

    浅谈ORACLE高水位线的解决方法.pdf

    浅谈ORACLE高水位线的解决方法.pdf

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

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

    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经验技巧集(十年工作经历)

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

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

    针对HWM过高的问题,有几种解决方案: 1. **移动表所在的表空间**:通过将表暂时移到另一个表空间再移回原来的位置来重置HWM,但这种方法需要额外的空间,并且可能会中断业务。 2. **导出与导入**:先导出表数据,...

    ORACLE数据库工程师面试题目

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

    oracle truncate恢复

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

    Enqueue Waits

    - **High Water (高水位线锁)**:用于标记表空间中使用的最高位置。 - **Buffer Header (缓冲区头部锁)**:用于锁定缓冲区头部结构。 6. **Sequence Cache Locks**:用于序列缓存中的资源锁定。 7. **Space ...

    针对oracle的优化与在线重组的文档

    在线重组作为一种先进的数据库维护技术,不仅解决了传统方法中的诸多问题,还极大地提高了数据库的可用性和性能。通过合理规划和实施在线重组策略,企业可以显著提升其数据库系统的稳定性和效率,从而更好地支持现代...

    oracle面试题

    它移动高水位线(High Water Mark, HWM),并不需要回滚段(Rollback Segment)。`TRUNCATE`操作无法通过回滚来撤销,速度较快。 - `DELETE`: 是一种DML(数据操作语言)操作,用于逐行删除表中的记录。需要回滚段...

    ORACLE数据库面试题解答DBA数据库管理员JAVA程序员架构师必看.docx

    - DDL操作,删除表中所有数据并重置高水位线(HWM),无需rollback段。 - **DELETE**: - DML操作,逐行删除数据,需要rollback段,执行速度相对较慢。 #### 八、使用索引的原因 - 加快查询速度,尤其是对于大型...

    oracla 面试常见试题

    两者均能清空表中所有记录,但`TRUNCATE`为DDL操作,仅移动高水位线(HWK),无需回滚段;而`DELETE`为DML操作,需回滚段,耗时更长。 #### 8. 索引的重要性 索引用于加速访问表中的数据块,提升查询效率。 #### 9....

    Killtest 免费提供 1Z0-033 资料下载

    - **选项D**:认为命令会返回错误,因为未使用的空间位于高水位线之上。 正确答案是**选项C**。 ### 3. Bitmap索引与性能下降 当在具有Bitmap索引的表上执行大量更新、插入或删除操作时,性能可能会下降。这是...

    贝塔斯曼商业案例研究

    总的来说,贝塔斯曼商业案例研究中的数据库管理策略聚焦于如何通过在线重组、优化存储参数、遵循Oracle最佳实践以及解决行链接和行迁移问题,来确保现代电子商务环境中的数据库服务标准,提高ROI,降低TCO,并提供不...

Global site tag (gtag.js) - Google Analytics