`

ORACLE批量更新四种方法比较

阅读更多
现在我们有2张表 如下:
T1--大表 10000笔 T1_FK_ID
T2--小表 5000笔   T2_PK_ID
T1通过表中字段ID与T2的主键ID关联
模拟数据如下:
--T25000笔数据
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;
     
--T110000笔数据          
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'
我们希望能把T1Subobject_Name字段也全部更新成'StevenHuang',也就是说T110000笔数据都会得到更新
方法一
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是比较消耗资源的操作,会有redoundo操作,在这个例子里面我们可以换用下面的方法,创建一张新表,因为采用insertupdate快的多,之后你会有一张旧表和一张新表,然后要怎么做就具体情况具体分析了~~~~~
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批量更新四种方法.txt ORACLE批量更新四种方法.txt

    ### Oracle 批量更新四种方法详解 #### 一、背景介绍 在数据库管理与应用开发过程中,经常需要对大量数据进行更新操作。特别是在Oracle数据库环境下,如何高效地执行批量更新,成为了提高系统性能的关键因素之一。...

    ORACLE 批量更新三种方式比较

    ### ORACLE 批量更新三种方式比较 在Oracle数据库中,有时我们需要对大量数据进行更新操作,这在很多业务场景中都非常常见。针对这一需求,本文将详细介绍并比较三种常用的批量更新方法:通过PL/SQL循环更新、使用...

    oracle批量插入数据脚本

    oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本,oracle批量生成数据脚本。

    kettle oracle批量加载-Oracle Bulk Loader

    kettle快速加载到oracle之oracle批量加载-Oracle Bulk Loader

    Oracle中多表关联批量插入批量更新与批量删除操作

    在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...

    Oracle批量更新方法.pdf

    ### Oracle批量更新方法 #### 一、背景与需求 在企业级应用中,尤其是在ERP(企业资源规划)系统中,数据库操作是极为常见的任务之一。其中,针对大量数据的更新操作往往成为性能优化的重点。Oracle数据库因其强大...

    C#实现Oracle数据批量导入

    GetSqlBulkCopy方法用于批量导入数据到Oracle数据库,而GetSqlBulkCopyByTable方法用于批量导入数据到指定的表中。 在GetSqlBulkCopy方法中,我们首先遍历DataSet中的每个DataTable,然后调用GetSqlBulkCopyByTable...

    oracle 批量插入数据存储过程

    oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用

    oracle批量跟新数据脚本

    oracle批量跟新数据脚本,oracle批量跟新数据脚本,oracle批量跟新数据脚本。

    oracle ODP.NET 批量插入或更新

    该方法实现了通过ODP.NET对Oracle数据库进行批量更新的功能。 - **参数说明** - `tableName`: 表示要更新数据的目标表名。 - `keyColumName`: 用于标识更新记录的主键列名。 - `columnRowData`: 类似于`Batch...

    oracle 批量插入存储过程

    oracle 批量插入存储过程,性能非常高!

    oracle批量删除数据

    ### Oracle批量删除数据知识点 #### 一、Oracle批量删除数据的优势与限制 ##### 优势: - **删除速度快**:在Oracle数据库中,采用特定的方法进行批量删除数据时,可以显著提高处理速度。根据描述中的信息,批量...

    C# Oracle批量插入数据进度条的实现代码

    考虑到当Excel数据量较大时,循环Insert语句效率太低,故采用批量插入的方法。在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中...

    Oracle批量执行传多个参数多个SQL文件

    首先,理解"Oracle批量执行传多个参数多个SQL文件"的含义:这通常涉及编写一个主脚本,该脚本能够接收多个参数,并依次对每个参数执行相应的SQL文件。这样的方法可以极大地提高工作效率,避免手动逐个运行SQL脚本的...

    oracle、sql数据库批量建索引

    Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理索引以优化查询速度。本文将深入探讨这两个数据库系统中如何批量创建和删除索引,以及它们对系统运行效率的影响。 首先,让我们了解...

    springboot项目在Oracle下测试批量添加和批量删除

    springboot项目在Oracle下测试批量添加和批量删除,使用spring boot构建的项目,数据库配置的时oracle,想换成MySQL自己把配置文件中的MySQL链接注释去掉即可。项目测试了Oracle下添加,删除数据,批量添加和批量删除...

    java批量插入Oracle数据方法

    Java批量插入Oracle数据是一种高效的数据处理策略,尤其是在大数据量场景下。通过合理设计代码结构,利用`PreparedStatement`的批处理功能,可以显著提升数据插入的速度和系统的整体性能。在实践中,还需注意细节如...

    高效批量插入和更新

    C#批量插入,更新ORACLE 保存100万条数据大概3-5秒 保存或者更新100万条数据大概20秒 DataTable保存100万条数据大概1-2分钟 可能因环境原因时间有差异,不过可以看出性能还是很大提升的

    java代码oracle数据库批量插入

    ### Java代码实现Oracle数据库批量插入的关键知识点 #### 1. JDBC连接配置 - **JDBC URL**: `jdbc:oracle:thin:@IP:1521:orcl`,这里的URL指定了连接到Oracle数据库的方式。其中`@IP:1521:orcl`中的IP是指数据库...

    oracle批量清空表数据sql脚本

    oracle批量清空表数据sql脚本

Global site tag (gtag.js) - Google Analytics