使用BULK COLLECT+FORALL加速批量提交
为什么80%的码农都做不了架构师?>>>
一、 批量提交
批量提交特点:
占用较少undo,资源(独占锁,undo)快速释放,执行时间长
批量提交适合场景:
在线大批量插入,更新,删除数据
二、 BULK COLLECT+FORALL性能提升
1.通过BULK COLLECT加速查询
不管是显示游标还是隐式游标,都可以通过BULK COLLECT在数据库的单次交互中获取多行数据。BULKCOLLECT相对Cursor Loop方式减少了PL/SQL引擎和SQL引擎之间的切换次数,因此也减少了提取数据时的额外开销。
2 通过LIMIT rows限制提取的记录数
这种方法会减少对PGA的消耗,避免换页产生
3通过FORALL 加速DML
FORALL告诉PL/SQL引擎要先把一个或多个集合的所有成员都绑定到SQL语句中,然后再把语句发送给SQL引擎, 如果for ..loop 循环,那么会发送n(循环的次数)次,而用Forall,一次行全部发送过去。
三、 BULK COLLECT + FORALL 批量提交例句
insert
declareTYPE ARRAY IS TABLE OF big_table%ROWTYPE;l_data ARRAY;CURSOR c ISSELECT * FROM big_table;
BEGINOPEN c;LOOPFETCH c BULK COLLECTINTO l_data LIMIT 5000;FORALL i IN 1 .. l_data.COUNTINSERT /*+append*/INTO big_tableVALUES l_data(i);commit;EXIT WHEN c%NOTFOUND;END LOOP;CLOSE c;
delete
DECLARECURSOR mycursor ISSELECT rowid FROM t WHERE OO = XX;TYPE rowid_table_type IS TABLE OF rowid index by pls_integer;v_rowid rowid_table_type;
BEGINOPEN mycursor;LOOPFETCH mycursor BULK COLLECTINTO v_rowid LIMIT 5000;EXIT WHEN v_rowid.count = 0;FORALL i IN v_rowid.FIRST .. v_rowid.LASTDELETE t WHERE rowid = v_rowid(i);COMMIT;END LOOP;CLOSE mycursor;
END;
update
DECLARECURSOR mycursor ISSELECT t_pk FROM t WHERE OO = XX;TYPE num_tab_t IS TABLE OF NUMBER(38);pk_tab NUM_TAB_T;
BEGINOPEN mycursor;LOOPFETCH mycursor BULK COLLECTINTO pk_tab LIMIT 5000;EXIT WHEN pk_tab.count = 0;FORALL i IN pk_tab.FIRST .. v_rowid.LASTUPDATE t SET name = name || ’bulk’ WHERE t_pk = pk_tab(i);COMMIT;END LOOP;CLOSE mycursor;
END;
转载于:https://my.oschina.net/168052730/blog/644282
使用BULK COLLECT+FORALL加速批量提交相关推荐
- forall分批提交oracle,使用BULK COLLECT+FORALL加速批量提交
一.批量提交 批量提交特点: 占用较少undo,资源(独占锁,undo)快速释放,执行时间长 批量提交适合场景: 在线大批量插入,更新,删除数据 二.BULK COLLECT+FORALL性能提升 1 ...
- PL/SQL批处理语句:BULK COLLECT 和 FORALL
PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销 请看下图 ...
- PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT
Oracle PL/SQL 开发的童鞋,一定对O家的bulk批量处理的性能很是赞赏吧. 但是PostgreSQL用户请不要垂涎,作为学院派和工业界的一颗璀璨明珠. 开源数据库PostgreSQL,也有 ...
- oracle bulk collect
碰到的问题,有一个员工表,存储着员工的各种信息. 我要写一个过程,传进去员工的名字,打印该员工的信息. create or replace procedure getInfo(name emp.ena ...
- bulk怎么使用oracle,oracle学习之bulk collect用法
通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率 Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使 ...
- Oracle学习笔记之五sp1,PL/SQL之BULK COLLECT
Bulk Collect特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQ ...
- oracle大数据量迁移,分批量导入样例(fetch...bulk collect)以及forall结合使用
//插入时不产生日志, alter table IALHospitalInfo nologging; //记录时间 set timing on; declareCURSOR cur is select ...
- Oracle 中使用 fetch bulk collect into 批量效率的读取
http://www.jzxue.com/shujuku/oracle/201109/21-8976.html 通常我们获取游标数据是用 fetch some_cursor into var1, va ...
- Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
通常我们获取游标数据是用 fetch some_cursor into var1, var2 的形式,当游标中的记录数不多时不打紧.然而自 Oracle 8i 起,Oracle 为我们提供了 fetc ...
最新文章
- android dslr控制软件,DSLR Controller
- 没抢到欧冠杯的票?没关系!在VR中看!
- oracle学习笔记三
- PrincipleCTEbook
- oracle 日期计算
- python怎么一直循环_python 基础之while无限循环
- 计算机文字处理操作题33,2017年国家计算机等级考试试题【文字处理】.doc
- 关于Cocos2d-x发布游戏的时候遇到的问题和解决
- 决策树1 -- ID3_C4.5算法
- After Effects - Bodymovin 插件验货及感受
- Leetcode--用两个栈实现一个队列
- 天翼1号2021修改IMEI教程
- 解决应用MSBuild编译项目没有拷贝间接引用的dll题目
- java 特立独行的幸福
- 如何将栅格数据与行政边界_实时大数据监控–与边界专家Gary Read进行问答
- 纯css position:sticky 实现表格首行和首列固定
- python扫描局域网端口和ip_我想用python扫描局域网内的ip和mac地址,需要什么第三方库...
- SWIG使用简明教程(一)
- NCBI参考序列RefSeq
- 【云原生Docker系列第三篇】Docker网络模式(在失去的所有人里,我最怀念自己 )
热门文章
- android contentresolver 批量,Android之使用ContentResolver对通信录中的数据进行简单操作...
- 耳挂式蓝牙耳机原理_挂耳式蓝牙耳机如何佩戴
- 需要某个字体包才能正确显示此页面_[三分钟小文]前端性能优化-页面加载速度优化...
- android web developer,Growth: 一个关于如何成为优秀Web Developer 的 App
- 前端学到什么程度可以找到工作?
- 学java出来工作会很忙吗?
- 10个前端开发人员必须知道的CSS框架
- 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别
- mysql5.718免安装教程_mysql5.7.18版本免安装配置教程
- 后端根据百度地图真实路径距离_百度地图开放平台介绍--路线规划