一、引言
从来没有想过,删除表中的数据都会成为问题。但是,当表中的数据量非常大时,删除数据会成为一个不小的问题。
这里简单介绍一下我本人遇到的一个小问题及解决过程,仅讨论过程,不涉及SQL、存储过程的写法。方法很简单,高手绕行。
二、场景
运行了一年多的生产库,每小时大约五万条数据,总数据量超过四亿。今天发现有一个星期程序出了问题,整整一个星期的数据是重复的。需要把重复的数据删除。
三、解决过程
(一)
删除重复数据的SQL很简单,用ROWID来排除就可以了,最开始想到的方法是使用一个SQL来解决问题。很快写出来,在测试库上验证成功。
打开SQL Plus,执行删除SQL。结果执行了一天多,都没有执行完,而且由于时间太长,SQL Plus与服务器的连接已经断开了。
不知是连接超时导致SQL没有执行完,还是执行完了连接断开事务没有提交而回滚了。专门去查了一下如何控制连接发呆时间,ORACLE有个参数可以控制,IDLE_TIME,但查到的资料说,长查询时,连接不会断开(事实证明好像不是这样,有点儿奇怪,难道执行时间很长的删除与长查询不一样???)修改IDEL_TIME会对系统运行有一定的影响,我决定还是不改它,想办法优化删除的方法。
(二)
接下来想到的方法是,先把重复的数据记录的ROWID找到,保存到一个临时表中,然后根据这个表使用存储过程来删除,每一万条提交一次数据,防止过多的UNDO数据(Oracle不支持避免生成UNDO日志的hint,应该是出于安全的考虑吧),提高效率,同时避免连接超时,事务回滚。
结果也是执行了一天多,没有结果,连接超时。
(三)
由于存储过程执行完成,才会显示过程中dbms_output.put_line输出的信息,专门建了个表记录存储过程执行过程中的调试信息。发现将重复数据的ROWID找到、插入临时表的时间特别长。
把查找重复数据的范围进行缩减,调整为对一个小时的数据进行查找、使用批量操作(bulk collect into,forall)的方法来删除。在生产库上进行了测试,大约5分钟执行完毕,效果不错。
再写一个存储过程,依次执行按小时删除的存储过程。也就是把按小时删除的过程打包成一个大的存储过程,一次性调用。结果还是没有执行成功,连接超时。
(四)
看来这个连接超时还真是个问题,可能是由于连接超时导致操作失败。但我每个小存储过程中都有提交操作,那也应该能完成部分数据的删除操作呀?事实上是没有任何数据被删除。这个问题我没有想通。
最后只好使用一个简单粗暴的方法:
exec delete_by_hour('2016101400');
exec delete_by_hour('2016101401');
exec delete_by_hour('2016101402');
……
写了大量这样的调用过程,复制到剪贴板中,然后粘到SQL Plus中,这些命令乖乖地一个接一个地执行,最后顺利地删除了所有数据,一共用了13个小时。
当然也可以将上面的内容保存在文本文件中,在SQL Plus中,使用@文件名,执行命令文件。
分享到:
相关推荐
在Oracle数据库管理中,物理删除数据文件是一种严重的情况,可能导致数据丢失或系统不可用。本文将深入探讨如何在危机情况下进行Oracle数据文件的物理删除恢复。这个话题对于DBA(数据库管理员)来说至关重要,因为...
- **DM (Data Mining)**:从大量数据中发现有用的信息和模式。 - **OEM (Oracle Enterprise Manager)**:用于管理Oracle环境的工具。 #### 2.2 数据仓库软件组件 - **OWB**:提供了图形化界面来创建和管理数据仓库...
直接使用`IN`子句与上述查询结合删除重复数据,但这种方法效率低下,尤其是在大量数据时: ``` DELETE FROM 表名 a WHERE (字段1, 字段2) IN ( SELECT 字段1, 字段2, COUNT(*) FROM 表名 GROUP BY 字段1, ...
### 删除大量数据脚本知识点详解 #### 一、概述 在数据库管理中,有时需要删除大量的重复或不再需要的数据记录。对于这种情况,如果使用普通的删除命令可能会导致性能问题,尤其是在处理大数据量时。因此,编写...
文章开篇即提出问题:在处理大量数据时,如何更高效地执行删除操作,同时尽量降低对业务运行的影响。这涉及到在删除时长和业务连续性之间的权衡。为了解决这一问题,文章提出了一系列的步骤和方法,并通过实验验证了...
与`DELETE`不同,`TRUNCATE`不涉及行级别的删除,而是直接释放表占用的数据段(segment),这使得它在处理大量数据时效率更高,但同时也意味着没有回滚信息可供恢复。 **1. 数据恢复的前提条件** 在尝试恢复被`...
- 更高效地处理大量数据流。 - **合理使用SQL与PL/SQL**: - 优先考虑使用SQL解决数据处理问题,除非确实需要用到PL/SQL的高级功能。 以上是对Oracle PL/SQL编程最佳实践中涉及的关键知识点的总结,涵盖了从基础...
在Oracle数据库中实施TDE时,推荐使用硬件加密加速功能,特别是对于大量数据的加密操作。支持AES-NI指令集的CPU如SPARC T4或Intel CPU可以提供硬件加速,从而提高TDE表空间加密的性能。在安装Oracle Database 11g R2...
在Oracle DG环境中,归档日志是实现数据保护和故障切换的关键组件。归档日志记录了数据库的所有更改,以便在主库出现问题时,备用库可以接管并继续服务。 "Oracle DG主备库删除归档脚本"是指用于管理和清理主库和备...
Oracle数据仓库是一个强大的工具,用于组织、存储和分析大量企业数据,以支持业务决策。它是一种专门设计用于高效查询和分析的数据存储系统,不同于传统的在线事务处理(OLTP)系统,后者更注重于数据的快速插入、...
了解如何使用SQL*Loader、EXP/IMP工具进行大量数据的导入导出,以及如何使用RMAN进行数据库备份和恢复,是数据库运维的基础。 7. **项目管理**(ch10projmanage) 在企业环境中,项目管理可能涉及数据库设计、实施...
3. **DML操作**:涉及INSERT、UPDATE和DELETE语句,用于在数据库中添加、修改和删除数据。还会讲解事务处理和回滚,确保数据的完整性和一致性。 4. **DDL操作**:创建和管理数据库对象,如表格、视图、索引、存储...
Oracle则是一款强大的关系型数据库管理系统(RDBMS),用于存储、管理和处理大量结构化数据。 要将Excel数据导入Oracle,通常有以下几种方法: 1. **数据导入工具**:Oracle提供了一款名为SQL Developer的数据管理...
- **历史数据管理**:对于包含大量历史数据的表,新数据通常被添加到最新的分区中。例如,只有当前月份的数据是可更新的,而其他 11 个月的数据只读。 **1.3 Oracle 支持的分区类型** Oracle 10g 提供了多种分区...
遵循本最佳实践,用户可以实现Oracle数据库的高效部署,提升业务响应速度,增强数据保护,同时降低运维复杂度。 1.5 关键组件 关键组件包括华为OceanStor F V5存储系统、UltraPath多路径软件以及Oracle数据库软件...
总之,定时删除Oracle日志脚本是一个实用的工具,它帮助我们有效地管理数据库日志,释放存储空间,同时保持数据安全。不过,使用时一定要遵循最佳实践,确保在删除日志文件之前做好备份,并理解删除日志对数据库的...
其中,`SQL*Loader`适合大量数据的快速加载,而`EXPDP/IMPDP`则用于整个表空间或特定对象的数据迁移。 2. **SQL*Loader** SQL*Loader是一个命令行工具,能够高效地将ASCII文本文件中的数据批量导入到Oracle数据库...
由于更新方式(图幅更新、范围更新、要素更新)的不同,数据会经历大量的增加、删除和修改操作,导致数据行链接和迁移。当数据块无法容纳新插入或更新后的数据行时,就会产生行链接或行迁移,这会降低I/O性能,因为...
Oracle数据库中的LOB(Large Object)类型是用来存储大量数据的,如文本、图像、音频或视频等。LOBs分为四种类型:BLOB(Binary Large Object)用于二进制数据,CLOB(Character Large Object)用于字符数据,NCLOB...
以上内容仅为Oracle运维最佳实践中的一部分核心知识点, 包括但不限于数据模型设计、大对象管理、虚拟列应用以及索引设计等方面的关键技术和最佳实践。通过学习这些内容, 可以帮助运维人员更有效地管理和优化Oracle...