在一个ORACLE数据库运行过程中,有时候会遇到要批量删除数据的情况,如一个保存历史数据的表中有大量的数据已经不需要保留,要将这部分数据删除。以下就这种情况可以采取的方法进行讨论。
1、使用TRUNCATE命令进行删除。
如果是整个表的数据都要删除的话,使用TRUNCATE TABLE命令是理想的选择。它删除了表中的所有数据,并且因为不写REDO LOG FILE,所以速度很快。删除的同时,表的索引和约束条件仍然存在。这种方法适用于ORACLE的各个版本。但是当要删除的数据只是表中的一部分时,这种方法便行不通了。
2、直接进行DELETE操作。
直接使用DELETE命令进行删除,如果删除的数据量较大时,可能导致回滚段出错。这是因为在删除数据的过程中,不断扩展回滚段,直到回滚段的最大范围数或回滚段所在表空间空闲空间用完而出错。解决这个问题可以通过给删除数据的事务指定一个足够大的回滚段或者将回滚段所在表空间的AUTOEXTEND选项打开,同时将回滚段的MAXEXTENTS改大或设为UNLIMITED。不过这样仍存在一个隐患,如果删除的数据量大,同时数据库工作于归档模式下时,有可能导致日志切换频繁,所有日志文件都处于需要归档的状况,而归档进程来不及归档日志文件的情况出现,这时数据库将被挂起,直到有可用的日志文件后才恢复正常。 所以这种方法也不理想。
3、通过PL/SQL循环分段删除。
第三种方法是专门针对上面第二种方法进行优化改进的。这种方法通过一段PL/SQL程序循环分段删除数据,逐步提交事务,达到缩小事务规模,安全删除数据的目的。
例如有一个数据表tem_employee,我们将对其中字段tem_employee.salary满足小于2000的记录进行删除,可以采用以下的PL/SQL程序。
declare
v_temp number;
begin
loop
begin
select 1 into v_temp from tem_employee where tem_employee.salary>2000 and rownum=1;
delete from tem_employee where tem_employee.salary>2000 and rownum<100;
commit;
exception
when no_data_found then
exit;
end;
end loop;
end;
程序的第1和第2行声明了一个临时变量。第4到第13行定义了一个循环,在这个循环中第6行不断检查表中是否还有满足条件的记录,如果有,第7行程序便执行删除操作,每次删除100记录,同时提交事务。当表中已无满足条件的记录时,便引起NO_DATA_FOUND的异常,从而退出循环。
优点:通过分批删除,逐步提交,缩小了事务的规模,从而达到避免出现回滚段错误的目的。
缺点:然而这种方法依然存在因日志切换频繁,而归档进程来不及归档日志文件而导致数据库挂起的可能性。
下面的程序通过ORACLE所提供的dbms_lock包中的过程sleep,解决了这个问题,从而达到安全快速大量删除数据的目的。
declare
v_lognum number;
v_needarc number;
begin
select count(1)into v_longnum from v&log;
loop
loop
select count(1)into v_needarc from v&archive;
if v_needarc< v_longnum-1 then
exit;
else
dbms_lcok.sleep(60);
end if;
end loop;
delete from employee where employee.salary<2800 and rownum<100;
if sql%rowcount= 0 then
exit;
end if;
commit;
end loop;
end;
程序中的第2和第3行声明了两个变量v_lognum和v_needarc来保存数据库中日志文件的数量和当前需要归档的日志文件数量
第5行获取了数据库中日志文件的数量
第6行到第21行开始了删除数据的循环,第7行到第14行是一个子循环,不断检测当前需要归档的日志文件的数量v_needarc是否小于数据库的日志文件总数v_lognum减去1,如果满足条件,则退出子循环,开始删除数据。否则的话便调用dbms_lock.sleep()过程,使程序休眠60秒,然后继续子循环,检测需归档的日志文件数量。
第17到19行,检查删除数据的结果,如果已无数据,则退出,程序结束。
这个程序,通过利用dbms_output.sleep()过程,在删除过程中当需要归档的日志文件达到认定的限制时,使删除过程暂时停止,等待ARCH进程将日志文件归档后再继续进行,从而达到避免归档日志文件来不及归档,导致数据库挂起的问题。
此方法适用于oracle的各个版本
4、使用NOLOGGING选项重新建表。
在ORACLE 8以后的版本中,CREATE TABLE命令提供了NOLOGGING的选项,在建表时不用写日志文件。
这样当我们在删除大量的数据时可以将要保留的数据通过CREATE TABLE ... NOLOGGING ... AS SELECT * FROM...的方法将要保留的数据备份到另一个表中,将原来的表删除,然后再 ALTER TABLE RENAME TO 命令将备份的表改为原来表的名字。
这个方法由于不写日志文件,所以速度很快,但是原来的表所拥有的索引和约束都将不存在,需重新建立。另外这个方法只适用于ORACLE 8以后的版本,ORACLE 7.3中也可采用这个方法,但NOLOGGIN关键字要由UNRECOVERABLE代替。
此处有关于优化.......数据来源于点击此处
分享到:
相关推荐
此外,start或@命令执行SQL脚本,edit命令编辑SQL文件,spool命令将屏幕输出重定向到文件,这在批量处理和日志记录中非常有用。 交互式命令如"&"允许在SQL语句中使用变量,由用户在执行时输入。例如,select * from...
- **实例与数据库**:Oracle数据库实例是运行在服务器上的内存结构,用于管理和处理数据库中的数据。实例由系统全局区(SGA)和程序全局区(PGA)组成。 - **表空间与数据文件**:表空间是数据库逻辑存储的容器,...
### Oracle优化笔记 #### SQL语句优化 在SQL语句优化方面,主要关注查询效率、减少数据冗余以及提升整体性能。以下几点是常见的优化手段: 1. **使用索引**:合理创建索引可以显著提高查询速度。例如,基于功能的...
这两者在IT领域中都有着举足轻重的地位,尤其在企业级应用开发中,Oracle作为数据存储的核心,Java则常用于构建应用程序并与数据库进行交互。 1. **Oracle DBA基础知识** - 数据库概念:理解数据库的基本概念,如...
Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。Oracle数据库系统提供了高效的数据存储、管理和处理能力,支持复杂的事务处理和数据仓库应用。本学习笔记结合了代码示例,将帮助你...
在编程中处理Oracle事务是确保数据一致性的关键,事务的ACID属性(原子性、一致性、隔离性和持久性)必须得到保障。 Oracle提供了丰富的内置函数,如数学函数、字符串函数、日期时间函数等,极大地方便了数据处理。...
本篇文章将深入探讨Oracle中的PL/SQL表、记录以及成员函数,这些都是Oracle编程中不可或缺的部分。 首先,让我们来看看PL/SQL表,也被称为可变数组或集合。PL/SQL表在PL/SQL块中临时存储数据,类似于数组,但它们...
- **通过游标更新数据**:批量处理数据。 - **游标变量**:存储游标的引用。 - **给PACKAGE加密**:保护敏感的存储过程和函数。 - **Oracle Advanced Queue**:用于消息队列的应用程序接口。 - **跨数据库的SQL...
以上是Oracle SQL学习笔记中涵盖的部分核心概念,这些知识对于有效管理Oracle数据库、提升查询效率和确保数据一致性至关重要。在实际应用中,还需要结合具体业务需求和数据库设计进行灵活运用。
在学习Oracle 11g的过程中,了解并掌握其基本概念、安装、用户管理、权限和角色、数据对象以及管理工具的使用至关重要。 首先,安装过程虽然在此略过,但在实际操作中,Oracle 11g的安装包括下载安装包、配置环境...
在Oracle数据库中,可以通过一条SQL语句对单一记录的多个字段进行批量修改。例如,将员工SCOTT的职位(job)、薪水(sal)和佣金(comm)三个字段的值更改为另一员工SMITH的相应值。具体语句如下: ```sql UPDATE emp SET...
2. 文件操作命令:Oracle提供了SQL*Loader用于批量导入数据,SQL*Plus的`SPOOL`命令可以将查询结果输出到文件。此外,`ALTER SYSTEM SET`用于修改系统参数,`CREATE PFILE FROM SPFILE`用于创建初始化参数文件副本。...
笔记中可能包含SELECT语句用于查询数据,INSERT语句用于插入数据,UPDATE用于修改数据,以及DELETE用于删除数据等基本操作。 4. **数据库创建与管理**:讲解如何使用CREATE DATABASE命令创建一个新的Oracle数据库,...
Oracle学习笔记概述 Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,由甲骨文公司(Oracle Corporation)开发和维护。它以其高效、稳定和强大的功能在企业级应用中占据重要地位。Oracle学习笔记...
- **工具概述**:SQLLoader 是 Oracle 自带的一种强大的数据加载工具,主要用于将外部文件中的数据导入到 Oracle 数据库中。与 EXP 和 IMP 相比,SQLLoader 在数据迁移方面更加灵活,尤其是在不同版本的数据库之间...
- **删除数据库**:删除Oracle数据库的步骤。 - **卸载软件**:彻底卸载Oracle软件的方法。 #### 三、Oracle 10.2.0.1至10.2.0.4升级 - **升级过程**:详细介绍从Oracle 10.2.0.1版本升级到10.2.0.4版本的具体...
4. **数据操作**:插入、更新、删除和查询数据,提供数据导入导出功能。 5. **性能分析**:使用性能监控工具分析SQL执行计划,找出性能瓶颈。 6. **版本控制集成**:与常见的版本控制系统(如Git)集成,便于团队...
5. 事务和回滚:在Oracle中,事务是一组逻辑操作,要么全部成功,要么全部回滚,保证了数据的一致性。`COMMIT`提交事务,`ROLLBACK`回滚事务,`SAVEPOINT`设定回滚点。 6. SQL实用命令:`DESCRIBE`显示表结构,`...