参考:http://www.eygle.com/archives/2005/04/oracleoeouaeeae.html
批量删除海量数据通常都是很复杂及缓慢的,方法也很多,但是通常的概念是:分批删除,逐次提交。
下面是我的删除过程,我的数据表可以通过主键删除,测试过Delete和For all两种方法,for all在这里并没有带来性能提高,所以仍然选择了批量直接删除。
操作如下:
--创建日志记录表
create table TB_ARCHIVE_LOG_RUNNING
(
PROC_NAME VARCHAR2(30) null,
PROC_DESC VARCHAR2(255) null,
TABLE_NAME VARCHAR2(255) null,
REC_TIME DATE null,
PROC_RESULT VARCHAR2(30) null
);
--记录日志存储过程
CREATE OR REPLACE PROCEDURE "P_WRITE_RUNLOG" (I_PROC_NAME IN VARCHAR2,
I_PROC_DESC IN VARCHAR2,
I_TABLE_NAME IN VARCHAR2,
I_REC_TIME IN DATE,
I_PROC_RESULT IN VARCHAR2) IS
BEGIN
INSERT INTO TB_ARCHIVE_LOG_RUNNING
(PROC_NAME, PROC_DESC, TABLE_NAME, REC_TIME, PROC_RESULT)
VALUES
(I_PROC_NAME, I_PROC_DESC, I_TABLE_NAME, I_REC_TIME, I_PROC_RESULT);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO TB_ARCHIVE_LOG_RUNNING
(PROC_NAME, PROC_DESC, TABLE_NAME, REC_TIME, PROC_RESULT)
VALUES
(I_PROC_NAME, I_PROC_DESC, I_TABLE_NAME, I_REC_TIME, '写日志出错');
COMMIT;
END P_WRITE_RUNLOG;
例1:
--删除ID区间数据存储过程
--参数 p_tablename 表名
--参数 p_max 要删除的最大ID
--参数 p_min 要删除的最小ID
CREATE OR REPLACE PROCEDURE DELETE_TABLE
( p_tablename in varchar2,
p_max in number,
p_min in number ) IS
x number(20);
t_name varchar2(100);
BEGIN
P_WRITE_RUNLOG('deleteBegin','删除数据从:'||p_min||'到:'||p_max,p_tablename,sysdate,'INFO');
x := p_min;
t_name := p_tablename;
while x + 1000 < p_max loop
x := x + 1000;
execute immediate 'delete from '||t_name||' where id < '||x;
commit;
end loop;
P_WRITE_RUNLOG('deleteEnd','删除数据从:'||p_min||'到:'||p_max,p_tablename,sysdate,'INFO');
END DELETE_TABLE;
--执行 参数:表名,最大ID,最小ID
exec DELETE_TABLE('report_netunit_interfaces' ,6000,3000 );
例2:
--删除指定表格p_num条数据
CREATE OR REPLACE PROCEDURE DELETE_TABLE_NUM (
p_tablename in varchar2,
p_num in number ) IS
p_min number(20);
p_max number(20);
t_name varchar2(100);
x number(20);
BEGIN
execute immediate 'select min(ID) from '|| p_tablename into p_min;
p_max := p_min + p_num;
P_WRITE_RUNLOG('deleteBegin','删除数据从:'||p_min||'到:'||p_max,p_tablename,sysdate,'INFO');
x := p_min;
t_name := p_tablename;
while x + 1000 < p_max + 1 loop
x := x + 1000;
execute immediate 'delete from '||t_name||' where id < ' || x;
commit;
end loop;
P_WRITE_RUNLOG('deleteEnd','删除数据从:'||p_min||'到:'||p_max,p_tablename,sysdate,'INFO');
END DELETE_TABLE_NUM;
exec DELETE_TABLE_NUM ('report_netunit_interfaces',1000);
分享到:
相关推荐
Oracle 定时删除数据 并释放空间 ,创建存储过程并使用job完成。
在Oracle数据库中,进行大批量数据删除是一项需要注意性能和安全性的任务。常见的方法包括使用DELETE语句、FOR ALL语句,以及通过存储过程实现分批删除。以下将详细阐述这些方法及其优缺点。 首先,最基本的删除...
Oracle中大批量删除数据的方法 Oracle中大批量删除数据的方法是数据库管理员和开发者们经常面临的挑战之一。当数据库中的数据量非常大时,删除数据的操作可能会变得非常慢,甚至影响到整个数据库的性能。因此,...
Oracle数据库的分区技术是一种高效管理和处理大量数据的策略,它将大表或索引分割成较小的物理段,称为分区。这种技术的核心理念是“分而治之”,即将大规模的数据对象依据特定的字段值(分区键)划分为多个独立的...
Oracle的分区技术是一种高效的数据管理策略,特别是在处理大数据量时,能够显著提升数据库的性能、可管理和可用性。分区的基本思想是将一个大的数据对象(如表或索引)分割成若干个小的物理段,根据分区字段的值将...
通过上述示例代码,我们可以看到如何利用Oracle的游标、BULK COLLECT 和 FOR ALL 结合ROWID来实现高效的大批量数据删除。这种方法不仅大大提高了数据处理的速度,还保证了操作的安全性和可靠性。对于经常需要处理...
本文主要分享了在开发和优化Oracle存储过程时的一些关键经验和技巧,适用于数据库开发人员,特别是那些处理大数据量和需要进行性能优化的项目。 首先,对于跨库操作,建议在当前库中创建视图(View)来替代直接引用...
并行INSERT尤其适用于大批量数据的加载,而并行UPDATE和DELETE则有助于大型数据表的快速修改。 #### 4. 并行DDL操作 除了查询和DML操作,Oracle还支持并行DDL(Data Definition Language)操作,如并行创建索引、...
这种方式不会记录操作的日志,适用于大批量数据的导入。例如,可以将`emp`表中特定列的值复制并插入到`new_emp`表中。 最后,Oracle 10g支持无条件多表插入,允许一次操作将数据插入多个表。基本语法是`INSERT [ALL...
6. **数据库的使用**:当数据量达到百万级别时,使用数据库(如MySQL、Oracle、SQL Server或NoSQL数据库)存储数据更为合适。数据库可以提供高效的查询和数据管理功能,同时支持批量导入导出。 7. **数据预处理**:...
- **适用场景**:适用于大批量数据插入操作。 3. **使用预编译的执行计划** - **原理**:预编译执行计划是指通过事先确定最优执行路径来避免每次执行SQL时都要重新解析和优化。 - **优点**:减少了SQL解析时间...
3. **大批量数据操作**: - **分区插入**:通过直接插入到特定分区,可以避免全表锁定,提高并发性。 - **分区交换**:用新的分区替换旧的分区,实现无锁的数据更新。 - **分区合并**:当几个小分区达到一定规模...
1. **如何大批量更新数据而不影响正常业务** 在Oracle数据库中,对大量数据进行更新时,若使用单一的`UPDATE`语句,可能会因长时间锁定资源而严重影响业务运行。解决策略之一是**“花整为零”**,即把大规模的更新...
- **SQLLoader**:介绍SQLLoader工具的使用,用于大批量导入导出数据。 #### 第二十五章 数据库设计范式 - **第一范式(1NF)**:确保表中的每一列都是不可分割的基本数据项。 - **第二范式(2NF)**:在1NF的基础上...
- **批量数据操作**:使用SQL*Loader等工具进行大批量数据导入导出。 #### 第十四章 约束 - **约束类型**:PRIMARY KEY、FOREIGN KEY、UNIQUE等约束类型及其作用。 - **约束管理**:创建、启用、禁用、删除约束的...