现在我们有2张表 如下:
T1--大表 10000笔 T1_FK_ID
T2--小表 5000笔 T2_PK_ID
T1通过表中字段ID与T2的主键ID关联
模拟数据如下:
--T2有5000笔数据
create table T2
as
select rownum id, a.*
from all_objects a
where 1=0;
-- Create/Recreate primary, unique and foreign key constraints
alter table T2
add constraint T2_PK_ID primary key (ID);
insert /*+ APPEND */ into T2
select rownum id, a.*
from all_objects a where rownum<=5000;
--T1有10000笔数据
create table T1
as
select rownum sid, T2.*
from T2
where 1=0;
-- Create/Recreate primary, unique and foreign key constraints
alter table T1
add constraint T1_FK_ID foreign key (ID)
references t2 (ID);
insert /*+ APPEND */ into T1
select rownum sid, T2.*
from T2;
insert /*+ APPEND */ into T1
select rownum sid, T2.*
from T2;
--更新Subobject_Name字段,之前为null
update T2 set T2.Subobject_Name='StevenHuang'
我们希望能把T1的Subobject_Name字段也全部更新成'StevenHuang',也就是说T1的10000笔数据都会得到更新
方法一
写PL/SQL,开cursor
declare
l_varID varchar2(20);
l_varSubName varchar2(30);
cursor mycur is select T2.Id,T2.Subobject_Name from T2;
begin
open mycur;
loop
fetch mycur into l_varID,l_varSubName;
exit when mycur %notfound;
update T1 set T1.Subobject_Name = l_varSubName where T1.ID = l_varID;
end loop;
close mycur;
end;
---耗时39.716s
显然这是最传统的方法,如果数据量巨大的话(4000万笔),还会报”snapshot too old”错误退出
方法二.
用loop循环,分批操作
declare
i number;
j number;
begin
i := 1;
j := 0;
select count(*) into j from T1;
loop
exit when i > j;
update T1 set T1.Subobject_Name = (select T2.Subobject_Name from T2 where T1.ID = T2.ID)
where T1.ID >= i and T1.ID <= (i + 1000);
i := i + 1000;
end loop;
end;
--耗时0.656s,这里一共循环了10次,如果数据量巨大的话,虽然能够完成任务,但是速度还是不能令人满意。(例如我们将T1--大表增大到100000笔 T2--小表增大到50000笔
) 耗时10.139s
方法三.
--虚拟一张表来进行操作,在数据量大的情况下效率比方法二高很多
update (select T1.Subobject_Name a1,T2.Subobject_Name b1 from T1,T2 where T1.ID=T2.ID)
set a1=b1;
--耗时3.234s (T1--大表增大到100000笔 T2--小表增大到50000笔)
方法四.
--由于UPDATE是比较消耗资源的操作,会有redo和undo操作,在这个例子里面我们可以换用下面的方法,创建一张新表,因为采用insert比update快的多,之后你会有一张旧表和一张新表,然后要怎么做就具体情况具体分析了~~~~~
create table T3 as select * from T1 where rownum<1;
alter table T3 nologging;
insert /*+ APPEND */ into T3
select T1.* from T1,T2 where T1.ID=T2.ID;
--耗时0.398s (T1--大表增大到100000笔 T2--小表增大到50000笔)
*以上所有操作都已经将分析执行计划所需的时间排除在外
相关推荐
### Oracle 批量更新四种方法详解 #### 一、背景介绍 在数据库管理与应用开发过程中,经常需要对大量数据进行更新操作。特别是在Oracle数据库环境下,如何高效地执行批量更新,成为了提高系统性能的关键因素之一。...
### ORACLE 批量更新三种方式比较 在Oracle数据库中,有时我们需要对大量数据进行更新操作,这在很多业务场景中都非常常见。针对这一需求,本文将详细介绍并比较三种常用的批量更新方法:通过PL/SQL循环更新、使用...
oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本。
kettle快速加载到oracle之oracle批量加载-Oracle Bulk Loader
在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...
### Oracle批量更新方法 #### 一、背景与需求 在企业级应用中,尤其是在ERP(企业资源规划)系统中,数据库操作是极为常见的任务之一。其中,针对大量数据的更新操作往往成为性能优化的重点。Oracle数据库因其强大...
GetSqlBulkCopy方法用于批量导入数据到Oracle数据库,而GetSqlBulkCopyByTable方法用于批量导入数据到指定的表中。 在GetSqlBulkCopy方法中,我们首先遍历DataSet中的每个DataTable,然后调用GetSqlBulkCopyByTable...
oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用
oracle批量跟新数据脚本,oracle批量跟新数据脚本,oracle批量跟新数据脚本。
该方法实现了通过ODP.NET对Oracle数据库进行批量更新的功能。 - **参数说明** - `tableName`: 表示要更新数据的目标表名。 - `keyColumName`: 用于标识更新记录的主键列名。 - `columnRowData`: 类似于`Batch...
oracle 批量插入存储过程,性能非常高!
### Oracle批量删除数据知识点 #### 一、Oracle批量删除数据的优势与限制 ##### 优势: - **删除速度快**:在Oracle数据库中,采用特定的方法进行批量删除数据时,可以显著提高处理速度。根据描述中的信息,批量...
考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中...
首先,理解"Oracle批量执行传多个参数多个SQL文件"的含义:这通常涉及编写一个主脚本,该脚本能够接收多个参数,并依次对每个参数执行相应的SQL文件。这样的方法可以极大地提高工作效率,避免手动逐个运行SQL脚本的...
Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理索引以优化查询速度。本文将深入探讨这两个数据库系统中如何批量创建和删除索引,以及它们对系统运行效率的影响。 首先,让我们了解...
springboot项目在Oracle下测试批量添加和批量删除,使用spring boot构建的项目,数据库配置的时oracle,想换成MySQL自己把配置文件中的MySQL链接注释去掉即可。项目测试了Oracle下添加,删除数据,批量添加和批量删除...
Java批量插入Oracle数据是一种高效的数据处理策略,尤其是在大数据量场景下。通过合理设计代码结构,利用`PreparedStatement`的批处理功能,可以显著提升数据插入的速度和系统的整体性能。在实践中,还需注意细节如...
C#批量插入,更新ORACLE 保存100万条数据大概3-5秒 保存或者更新100万条数据大概20秒 DataTable保存100万条数据大概1-2分钟 可能因环境原因时间有差异,不过可以看出性能还是很大提升的
### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...
oracle批量清空表数据sql脚本