`

oracle 批量操作

阅读更多
现在我们有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笔)
*以上所有操作都已经将分析执行计划所需的时间排除在外
分享到:
评论

相关推荐

    kettle oracle批量加载-Oracle Bulk Loader

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

    C#实现Oracle数据批量导入

    C#实现Oracle数据批量导入 在本文中,我们将讨论如何使用C#语言实现对Oracle数据库的批量数据导入功能。本文的主要内容包括如何使用Oracle.DataAccess.Client命名空间来实现批量导入功能,以及如何使用SqlBulkCopy...

    ORACLE批量更新四种方法.txt ORACLE批量更新四种方法.txt

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

    java操作Oracle批量入库

    以上就是Java操作Oracle批量入库的基本步骤和注意事项。在实践中,还需要根据具体的应用场景和需求进行调整和优化。如果你想要查看更详细的代码示例和实践技巧,可以参考给出的博文链接:...

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

    在实际应用中,可以通过存储过程、事务处理或编程语言(如Java)的批处理功能来实现更复杂的批量操作逻辑。 总的来说,理解并熟练掌握Oracle中多表关联的批量插入、更新和删除操作,能够有效优化数据库性能,提高...

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

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

    ORACLE 批量更新三种方式比较

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

    oracle批量删除数据

    ### Oracle批量删除数据知识点 #### 一、Oracle批量删除数据的优势...通过以上分析,我们可以看到Oracle批量删除数据不仅能够有效提升数据处理效率,而且在实现过程中还需要考虑多种因素来确保操作的安全性和稳定性。

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

    在插入操作运行时,会造成系统短暂的“卡死”现象。为了让用户知道插入的状态,需要制作一个进度条来显示插入的进度。 批量插入 项目中运用的是System.Data.OracleClient。首先将Excel数据通过转换函数转换为...

    oracle、sql数据库批量建索引

    在数据库管理中,索引是...无论是Oracle还是SQL Server,理解如何批量操作索引,以及何时何地创建索引,都是数据库管理员必备的技能。通过合理的设计和管理,索引能够极大地提升查询效率,进而优化整个系统的运行效率。

    Oracle批量保存

    在C#中使用ODAC进行Oracle批量保存,主要涉及以下几个步骤: 1. **创建OracleConnection对象**:首先,我们需要创建一个`OracleConnection`对象,通过提供有效的数据库连接字符串来初始化。 2. **开启事务**:为了...

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

    springboot项目在Oracle下测试批量添加和批量删除,...项目测试了Oracle下添加,删除数据,批量添加和批量删除操作。使用sprignboot自带的test进行测试。本项目所使用的sql文件在resources下,自己plsql执行下即可。

    java代码oracle数据库批量插入

    批量插入操作 - **禁用自动提交**: 为了提高批量插入的效率,可以通过`con.setAutoCommit(false);`禁用自动提交功能。这样可以在一次网络往返中执行多条SQL语句,减少网络开销。 - **创建PreparedStatement**: 通过...

    批量修改Oracle序列值的存储过程

    这时,可以编写存储过程来实现批量操作。 博客提供的`seq.sql`文件可能包含了这个存储过程的定义。通常,这样的存储过程会接受序列名称和新的当前值作为参数,然后通过动态SQL来修改序列。例如: ```sql CREATE OR ...

    oracle快速批量生成表和触发器和序列.zip

    这个压缩包文件“oracle快速批量生成表和触发器和序列.zip”显然是为了帮助用户快速完成这类操作。下面将详细介绍这些概念以及如何在Oracle中实现它们。 1. **表(Table)**:在Oracle数据库中,表是存储数据的主要...

    oracle批量添加主键

    本篇文章将详细讲解如何在Oracle数据库中批量添加主键。 首先,我们可以通过SQL查询来找出所有没有主键的表。以下是一个示例查询: ```sql SELECT table_name FROM user_tables a WHERE NOT EXISTS ( SELECT * ...

    图片批量导入oracle数据库

    总之,批量导入图片到Oracle数据库是一项涉及到Java编程、JDBC连接、SQL操作以及文件处理的任务。掌握这些技能对于处理大量图片数据的数据库应用至关重要,无论是Web应用、数据分析还是其他领域。通过理解和实践,你...

    Oracle.DataAccess.dll x64 x86 批量操作

    这个库包含了对Oracle数据库进行各种操作的类和方法,包括但不限于连接、查询、事务处理、批量操作等。在本案例中,我们重点关注的是针对Oracle数据库的批量操作功能,特别提到了x64和x86两种架构的版本。 批量操作...

Global site tag (gtag.js) - Google Analytics