oracle 批量插入几千条数据只需100ms以内

Oracle实现往某表批量插入记录 Oracle如何实现往某表批量插入记录? 阅读详情

最终的sql


insert into DR_ADJUST_HISTORY ( AGGREGATOR_NAME, CUSTOMER_LEVEL, ADUJST_TYPE, INVITE_STATE, ADJUST_ID, USER_PROFILE_ID, MAX_ADJUST_P, ADJUST_E, RESPONSE_NUMBER, TOTAL_SUBSIDY, REWARD_POINT ) 
select k.* from (
 select  
		NULL as AGGREGATOR_NAME, 
		NULL as CUSTOMER_LEVEL, 
		NULL as ADUJST_TYPE, 
		NULL as INVITE_STATE, 
		NULL as ADJUST_ID, 
		NULL as USER_PROFILE_ID, 
		NULL as MAX_ADJUST_P, 
		NULL as ADJUST_E, 
		NULL as RESPONSE_NUMBER, 
		NULL as TOTAL_SUBSIDY, 
		NULL as REWARD_POINT
	from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '66d1c7c1-73ca-4f04-a3d3-290e2e3204e4', 4.6261826, 7.6549335, 0, 0.0, 0 from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', 'ef753dcf-762f-4a2b-8cbc-38e28d0ca5d6', 4.485621, 7.2969246, 0, 0.0, 0  from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '7a7ce2a8-d1fa-47e7-b169-d2432d3d7a88', 4.4442787, 8.377349, 0, 0.0, 0  from dual union
 
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '5a557a27-9d18-46b3-b8ab-a5e246b41b51', 0.0, 0.0, 0, 0.0, 0  from dual union
 select  '江苏', 2, 1, 0, '77f18207-54a1-43a8-a948-52c0f18c4e45', '069a8d65-3305-4df5-9bb6-0565d5e1c100', 0.0, 0.0, 0, 0.0, 0 from dual 

) k where k.AGGREGATOR_NAME is not NULL;

使用java代码拼接

private String getBatchSql(List<DrAdjustHistory> histories) {
        StringBuilder builder = new StringBuilder();
        builder.append(" select k.* from ( " +
                " select " +
                " NULL as AGGREGATOR_NAME,  " +
                " NULL as CUSTOMER_LEVEL, " +
                " NULL as ADUJST_TYPE,  " +
                " NULL as INVITE_STATE,  " +
                " NULL as ADJUST_ID,  " +
                " NULL as USER_PROFILE_ID,  " +
                " NULL as MAX_ADJUST_P, " +
                " NULL as ADJUST_E, " +
                " NULL as RESPONSE_NUMBER, " +
                " NULL as TOTAL_SUBSIDY, " +
                " NULL as REWARD_POINT " +
                " from dual union " );
        histories.stream().forEach( item ->{
            builder.append(" SELECT ");
            builder.append(" '" + item.getAGGREGATOR_NAME()+"' " ).append(" , ");
            builder.append(" '" + item.getCUSTOMER_LEVEL()+"' " ).append(" , ");
            builder.append(" '" + item.getADUJST_TYPE()+"' " ).append(" , ");
            builder.append(" '" + item.getINVITE_STATE()+"' " ).append(" , ");
            builder.append(" '" + item.getADJUST_ID()+"' " ).append(" , ");
            builder.append(" '" + item.getUSER_PROFILE_ID()+"' " ).append(" , ");
            builder.append(" '" + item.getMAX_ADJUST_P()+"' " ).append(" , ");
            builder.append(" '" + item.getADJUST_E()+"' " ).append(" , ");
            builder.append(" '" + item.getRESPONSE_NUMBER()+"' " ).append(" , ");
            builder.append(" '" + item.getTOTAL_SUBSIDY()+"' " ).append(" , ");
            builder.append(" '" + item.getREWARD_POINT()+"' " ).append(" from dual union ");

        });
        // 去除最后一个 union
        String sql = builder.toString();
        sql = sql.substring(0,sql.lastIndexOf("union"));
        sql += " ) k where k.AGGREGATOR_NAME is not NULL ";
        return sql;
    }

最终的mapper

  <insert id="batchInsertDataBySql" parameterType="java.lang.String">

        insert into DR_ADJUST_HISTORY
        ( AGGREGATOR_NAME, CUSTOMER_LEVEL, ADUJST_TYPE, INVITE_STATE, ADJUST_ID, USER_PROFILE_ID, MAX_ADJUST_P, ADJUST_E, RESPONSE_NUMBER, TOTAL_SUBSIDY, REWARD_POINT )
        ${batchSql}
    </insert>

基于代码形式的案例

 

插入两千条数据只需 200ms

<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="false">
        INSERT INTO
        T_MONITOR_ELEC_POPULATION
        <trim prefix="(" suffix=")" suffixOverrides=",">
            COURT_ID,
            RECORD_DATE,
            SEGMENTID,
            EEGRPID,
            POPULATION,
            INSERT_TIME
        </trim>
        SELECT a.* FROM(
        <foreach collection="list" item="item" separator="union all">
            select
                #{item.courtId},
                #{item.recordDate},
                #{item.segmentid},
                #{item.eegrpid},
                #{item.population},
                #{item.insertTime}
            from
            dual
        </foreach>
        )a
    </insert>

ORACLE 大批量插入数据 这种也是采用DML并发,适用于执行DML语句慢的应用场景。说明:这种方式只能按照串行的方式进行,如果有多个任务在同时进行,会导致进程等待,反而会影响传输的效率。但是源表的数据量是1亿的数据量,按照最普遍的方式 INSERT INTO 效率太低了。这种是采用INSERT 并发,适用于 查询快,插入慢的场景。注: 这种模式其实跟第三种差不多,只不过这种是会话级别的。这种采用DML并发,适用于执行DML语句慢的应用场景。这种采用查询并发,适用于插入快,查询慢的应用场景。3.插入和查询PARALLEL。 阅读详情

相关推荐

MyBatis批量插入的Oracle适配之道:当ORM框架遇见数据库方言

本文深入探讨了MyBatis在Oracle数据库中的批量插入适配策略,解析了ORM框架与数据库方言的兼容性问题。通过对比MySQL与Oracle的语法差异,详细介绍了INSERT ALL、UNION ALL和批量提交三种实现方式,并提供了性能优化和事务处理的高级技巧,帮助开发者高效解决跨数据库批量操作难题。

weixin_29273849的博客 710

oracle存储循环插入1000条数据

declare maxnumber constant number:=10000; i number :=1; begin for i in 1..maxnumber loop insert into T_JS_A01_JGWD(ID, REPORTID, INSID, INST_CHN_NM, FNCINS_ECD,

IT_Octopus的博客 4255

大规模数据导入场景下的批量插入语句优化与事务提交策略调整方法

在数据迁移、系统升级或业务初始化等场景中,大规模数据导入是技术团队绕不开的挑战。某金融机构在迁移千万级用户数据时,因未优化插入语句,单条记录插入耗时达 50ms,总导入时间预计超过 100 小时;而另一电商平台通过批量插入优化与事务策略调整,将亿级订单数据的导入时间从 72 小时压缩至 8 小时。大规模数据导入的核心矛盾在于 “数据量与导入效率的冲突”,单纯依靠硬件升级难以解决,必须从 SQL 语句设计与事务管理层面进行系统性优化。

yvysh16116的博客 1199

Oracle插入1000条限制

使用批量插入解决 列如: 一次插800条 while(rowList.size()>0){ List<Map<String, Object>> list1 = StringUtil.getBatchList(rowList, 800); service.importBankAcc(list1); } public static List get...

优快云_BXW的博客 3866

HarmonyOS NEXT 开发者预览版Beta招募应知测试

本次HarmonyOS NEXT 开发者预览版 Beta 招募活动为开发者预览版尝鲜升级,主要供开发者进行应用调测使用,除部分系统应用外,其他所有应用将被清除,因此在进行HarmonyOS NEXT 开发者预览版升级前,需进行数据备份。通过应知测试,并提交了参加HarmonyOS NEXT 开发者预览版招募 Beta 活动的报名信息,就会立刻审核通过并且收到新版本。手机在参加HarmonyOS NEXT 开发者预览版 Beta 招募活动前,需要对应机型升级到招募要求对应的基线版本,并预留内存空间。

长久公子的博客 8651

LTE信令流程及业务流程

eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。

qq_44390640的博客 4584

oracle数据库使用in操作1000条以上数据时报错

oracle批量使用in操作1000条数据以上时报错

weixin_45109517的博客 812

Rust 语言入门

Rust 使 对您的编辑或工具或代码所在的位置没有特定要求,因此 如果您更喜欢使用集成开发环境 (IDE) 而不是 命令行,请随意使用您最喜欢的 IDE。对于简单的程序来说,只编译 是可以的,但作为你的项目 增长,您将需要管理所有选项并轻松共享您的 法典。接下来,我们将向您介绍 Cargo 工具,它将帮助您编写 真实世界的 Rust 程序。现在您已经安装了 Rust,是时候编写您的第一个 Rust 程序了。这不重要 到你的代码所在的 Rust,但对于本书中的练习和项目, 我们建议在你的主目录中创建一个。

JohnChen(Net) 1476

深入分析JdbcTemplate批量插入慢的问题:PreparedStatement和Statement的差别

jdbcTemplate是Spring框架中的一个数据库操作工具类,类位置位于org.springframework.jdbc.core。其中具体的对数据库的链接实现,会依据application.properties或者其他配置文件中,具体配置的数据库连接类型,自动判定选用哪个jdbc的驱动包来实现相关操作。而这些驱动的jar包,也是依据java.sql包中定的相关接口规范进行实现开发的。jdb...

yingjia11的博客 8007

SSD盘符漂移导致OSD down场景模拟与恢复

运维团队反馈一个问题,现象是:某个OSD对应的cache分区发生了变化,比如原来cache使用的分区是/dev/sde,后来还是这块盘,但分区信息不知何故,变成了/dev/sdf(产品OSD设备并不是根据分区名称来map,而是根据partlabel),最终的现象是这个OSD down了,没法启动.接到这个现象的反馈后,记录一下这个问题在lab的复现方法。

Gavin Blog 943

nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河

利用nmap、X-Scan扫描靶机的漏洞,在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机,建立连接后上传冰河木马控制靶机,最后用冰河陷阱清除靶机的冰河木马,记一次完整的入侵控制实验。

m0_59302403的博客 4409

从性能优化视角看MyBatis与Oracle批量插入:一场效率与优雅的博弈

本文深入探讨了MyBatis与Oracle批量插入的性能优化策略,从基础到高阶方案全面解析。通过对比循环插入、INSERT ALL和UNION ALL等方法的实测数据,揭示了Oracle环境下批量操作的技术要点与性能差异,并提供了事务管理、并行处理等实战技巧,帮助开发者显著提升数据处理效率。

cake8的博客 957

MobaXterm简介和使用(服务器连接工具)

MobaXterm 是一个功能强大的远程计算工具,集成了许多常用的远程计算功能,包括 SSH、X11、RDP、VNC、FTP、SFTP 等。

清平乐的技术专栏 1968

oracle快速插入大量数据

方法一:循环 declare -- Local variables here m integer; begin -- Test statements here --输出开始时间 dbms_output.put_line('start:'||sysdate); m:=0; --循环插入的数据量 for i in 1..4000 l...

weixin_30577801的博客 1563

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

ATS Request中的PASID的作用是什么

摘要: PASID(进程地址空间标识符)是PCIe ATS(地址转换服务)中的关键组件,用于标识不同进程或虚拟机的地址空间。其主要作用包括:1)支持多进程共享设备时隔离地址空间;2)实现共享虚拟地址(SVA),允许用户态程序直接访问设备;3)提升虚拟化性能(如SIOV),通过PASID区分虚拟机请求;4)增强安全性,基于PASID限制设备内存访问权限。PASID通过20位标识符在TLP前缀中传递,与IOMMU协作完成地址转换与缓存,适用于高性能计算、AI及虚拟化场景,但依赖硬件支持和软件适配。

元直的博客 1563

Oracle - 批量操作FOR ALL,提升数据处理效率

Oracle - 批量操作 FOR ALL,提升数据处理效率 🚀 在企业级数据库应用中,Oracle 的 FORALL 语句是提升批量数据处理性能的关键工具。本文通过对比分析、原理剖析和实战演示,系统介绍了 FORALL 的高效应用。 核心要点 性能对比:FORALL 比逐行处理快 12.7 倍(万条数据测试) 工作原理: 单次 SQL 解析,批量执行 内部使用绑定数组,减少网络往返 服务端内存操作,降低上下文切换 Java 集成: 通过 JDBC 调用 PL/SQL 批量过程 使用 ARRAY 和 ST

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Seata集成Oracle批量插入优化实践

分布式事务是确保跨数据库操作一致性的关键技术,其中Seata作为开源解决方案在MySQL场景表现优异。针对Oracle数据库,批量插入操作因语法差异(如INSERT ALL语法)和性能优化需求成为技术难点。通过改造SQL解析器、优化事务上下文传播机制,Seata可实现对Oracle批量插入的原生支持,显著提升金融行业夜间批处理等场景的性能。实测表明,批量插入较单条操作可降低80%以上的耗时,同时减少内存占用。合理配置批次大小和序列缓存,结合AT/XA事务模式选择,能有效平衡吞吐量与稳定性。该方案已在Seat

weixin_33226548的博客 57

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java jdbc 批量_用JDBC实现批量插入的有效方法

虽然问题是使用JDBC高效插入Oracle,我目前正在使用DB2(在IBM大型机上),在概念上插入可能是相似的,所以认为在每次插入一个记录插入一批记录(非常有效)下面是衡量标准1)一次插入一个记录publicvoidwriteWithCompileQuery(intrecords){PreparedStatementstatement;try{Connectionconnection...

weixin_33657316的博客 637

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

mybaties 批量插入

mybaties 批量插入实现方式,oracle批量插入效率优化

qq_34374058的博客 272

Java 向oracle插入百万数据

这里的表是没加索引的,加了索引,效率会变慢,但是还是很高效。 long startTime=System.currentTimeMillis(); Connection conn=null; try{ conn=getConnection(); conn.setAutoCommit(fa...

iteye_1744的博客 727

单次插入与批量插入时间对比

单次插入200个用时1150ms, 单个 6ms 主要耗时:网络连接,(数据库日志,这个影响不大) 批量插入200个用时100ms左右,单个2ms 循环插入的1/3时间 转载于:https://www.cnblogs.com/yszzu/p/9656880.html...

weixin_30642869的博客 1029

Oracle - 插入、更新、删除,DML语句核心用法

INSERT是数据生命的起点,UPDATE是其成长与修正的脉搏,DELETE是其优雅退场的仪式。它们共同构成数据库最基础、最频繁、也最需敬畏的操作集合。本文从语法细节出发,穿越事务隔离、并发控制、Java 集成、安全防护与性能优化的层层关卡,试图为你构建一张完整的 DML 认知地图。永远显式书写WHERE—— 这是职业素养的底线;拥抱RETURNING与MERGE—— 它们让代码更短、更安全、更高效;用乐观锁应对高并发,用解决强一致—— 没有银弹,只有权衡;监控你的 DML,像监控心跳一样。

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Spring Boot批量数据操作性能优化实战

数据库批量操作是后端开发中的核心技术,通过减少网络通信和数据库解析开销显著提升性能。MyBatis等ORM框架提供了foreach标签等批量处理机制,配合合理的事务分片策略,可避免长事务导致的锁竞争问题。在Spring Boot项目中,结合动态批次调整、异步处理和消息队列等架构设计,能有效应对用户数据导入、状态批量更新等典型场景。Oracle的APPEND_VALUES提示和外部表等特性,可进一步优化百万级数据迁移效率。合理的批量大小选择和分页查询机制,是防止内存溢出(OOM)的关键实践。

weixin_29574585的博客 225

TaoToken 视角:10万条记录批量插入提速——Oracle 与 SQL Server 的 commit 策略与参数配置

10万条批量插入提速实测:Oracle 单条 commit 仅 600 条/秒,改为 2000 条一提交并复用 PreparedStatement 后 48 秒跑完。本文给出 Oracle JDBC 与 SQL Server SqlBulkCopy 可复制配置、commit 批次压测步骤,并用 TaoToken 统一管理测试数据生成与执行计划分析的模型接口,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 。

weixin_32535825的博客 144

向数据库添加100W 条数据 性能测试

向数据库添加100W 条数据 性能测试 ; 参考的相关网站目录:JDBC实现往MySQL插入百万级数据 https://www.cnblogs.com/fnz0/p/5713102.html MySql 的批量操作,要加rewriteBatchedStatements参数 http://blog.youkuaiyun.com/ptzrbin/article/details/21024207

爱是与世界平行 3492
上一篇: springCloud Alibaba-Nacos 初探
下一篇: oracle查看是否锁表语句
宁漂打工仔
博客等级 码龄9年 1万+粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁漂打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值