浅谈PL/SQL批处理语句:BULK COLLECT与FORALL对优化做出的贡献
复制代码 代码如下:
复制代码 代码如下: 下面详解这爷俩
END;
RETURNING employee_id,last_name BULK COLLECT INTO enums,names;
employee#119:Colmenares
CLOSE mycursor;
③ 在returning into中使用bulk collect
需求是在对数据库其他应用影响最小的情况下,以最快的速度完成
① 在select into语句中使用bulk collect
我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理
employee#116:Baida
FETCH cursor BULK COLLECT INTO ...[LIMIT rows];
BEGIN
如果业务无法停止的话,可以参考下列思路:
请看下图:
names namelist;采用BULK COLLECT可以将查询结果一次性地加载到collections中,而不是通过cursor一条一条地处理
END;
BEGIN
deleted6rows:
employee#117:Tobias
⑶ 限制BULK COLLECT 提取的记录数
假设你需要查询并处理1W行数据,你可以用BULK COLLECT一次取出所有行,然后填充到一个非常大的集合中
/
BEGIN
TYPE numlist IS TABLE OF employees.employee_id%TYPE;
--删除条件是oo=xx,这个需根据实际情况来定
注意在使用BULK COLLECT时,所有的INTO变量都必须是collections
在业务无法停止的时候,选择这种方式,的确是最好的
END;
复制代码 代码如下:
这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销㈠ 通过BULK COLLECT 加速查询
TYPE rowid_table_type IS TABLE OF rowid index by pls_integer;
复制代码 代码如下:
COMMIT;其中,rows可以是常量,变量或者求值的结果是整数的表达式
一般可以控制在每一万行以内提交一次,不会对回滚段造成太大压力

但是,FORALL和BULK COLLECT可以让PL/SQL引擎把多个上下文却换压缩成一个,这使得在PL/SQL中的要处理多行记录的SQL语句执行的花费时间骤降
代码如下:
employee#114:Raphaely
END LOOP;
employee#115:Khoo
DECLARE
可是,这种方法会消耗该会话的大量PGA,APP可能会因为PGA换页而导致性能下降
LOOP
v_rowid rowid_table_type;
CURSOR mycursor IS SELECT rowid FROM t WHERE OO=XX ORDER BY rowid;
SELECT salary BULK COLLECT INTO sals FROM employees where rownum<=50;
employee#118:Himuro
这时,LIMIT子句就非常有用,它可以帮助我们控制程序用多大内存来处理数据
DBMS_OUTPUT.PUT_LINE('employee#'||enums(i)||':'||names(i));
这里举DELETE就可以了,UPDATE同理
⑴ BULK COLLECT 的用法
LOOP
--接下来使用集合中的数据
END LOOP;
请再看下图:
dept_recs deptrectab;
可以在select into ,fetch into , returning into语句使用BULK COLLECT
/
⑵ BULK COLLECT 对大数据DELETE UPDATE的优化
DECLARE
FOR i IN enums.FIRST .. enums.LAST
END;
BEGIN
OPEN mycursor;
FETCH mycursor BULK COLLECT INTO v_rowid LIMIT 5000;--5000行提交一次
TYPE namelist IS TABLE OF employees.last_name%TYPE;
DECLARE
我在做大DML时,通常选择一两千行一提交
--接下来使用集合中的数据
EATE TABLE emp AS SELECT * FROM employees;DECLARE TYPE numlist IS TABLE OF employees.employee_id%TYPE; enums numlist; TYPE namelist IS TABLE OF employees.last_name%TYPE; names namelist;BEGIN DELETE emp WHERE department_id=30 RETURNING employee_id,last_name BULK COLLECT INTO enums,names; DBMS_OUTPUT.PUT_LINE('deleted'||SQL%ROWCOUNT||'rows:'); FOR i IN enums.FIRST .. enums.LAST LOOP DBMS_OUTPUT.PUT_LINE('employee#'||enums(i)||':'||names(i)); END LOOP;END;/deleted6rows:employee#114:Raphaelyemployee#115:Khooemployee#116:Baidaemployee#117:Tobiasemployee#118:Himuroemployee#119:Colmenares
DELETE emp WHERE department_id=30enums numlist;
② 在fetch into中使用bulk collect
EXIT WHEN v_rowid.count=0;
CREATE TABLE emp AS SELECT * FROM employees;
DECLARE
DELETE t WHERE rowid=v_rowid(i);
sals sallist;
/
复制代码 代码如下:
CURSOR cur IS SELECT department_id,department_name FROM departments where department_id>10;FORALL i IN v_rowid.FIRST..v_rowid.LAST
举几个简单例子:
例子:
FETCH cur BULK COLLECT INTO dept_recs;

TYPE sallist IS TABLE OF employees.salary%TYPE;
DBMS_OUTPUT.PUT_LINE('deleted'||SQL%ROWCOUNT||'rows:');
TYPE deptrectab IS TABLE OF departments%ROWTYPE;
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/sql/oracle/3611.shtml
相关文章
热门TAG
命令 权重 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 服务器 网站流量 实例解析 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows SEO优化 蜘蛛 搜索引擎 网站收录 JSP最新文章
-
Window下Oracle Database 11g 发行
时间:2020-12-29
-
Oracle如何实现like多个值的
时间:2020-12-29
-
maven添加oracle依赖失败问题
时间:2020-12-29
-
OracleRAC基本概念及入门
时间:2020-12-29
-
Azure File Storage 基本用法
时间:2020-12-26
-
Oracle 权限(grant revoke)
时间:2020-12-26
-
Azure Queue Storage 基本用法
时间:2020-12-26
-
如何对比迁移前后的Orac
时间:2020-12-26
热门文章
-
Azure Queue Storage 基本用法 Azure Storage 之
时间:2020-12-26
-
Oracle存储过程编程详解
时间:2020-12-07
-
win10下oracle 11g安装图文教程
时间:2020-12-25
-
oracle 数据库学习 基本结构介绍
时间:2020-12-13
-
Azure File Storage 基本用法 Azure Storage 之 F
时间:2020-12-26
-
windows使用sqlpus连接oracle 数据库的教程图
时间:2020-12-25
-
Window下Oracle Database 11g 发行版2安装教程
时间:2020-12-29
-
Oracle解锁的方式介绍
时间:2020-12-14
-
linux下oracle设置开机自启动实现方法
时间:2020-12-13
-
Oracle学习记录之使用自定义函数和触发器
时间:2020-12-07
