在PL/SQL批处理语句的一个简短的讨论:批量收集所有优化的贡献
这一引擎与SQL引擎之间的控制转换称为上下文更改,每次更改时都有额外的开销。
请看下面的图片。
然而,所有和散装收集可以使PL / SQL引擎压缩多重语境为一体,这使得它的PL / SQL中的多行SQL语句的执行时间的需要。
请再看下一张图片。
下面是他们两个的详细解释。
通过批量收集加速查询
使用散装货物
通过批量收集,查询结果可以立即加载到集合中,而不是一次一次地加载到集合中。
可以在选择中使用批量收集、提取、返回语句。
注意,当使用批量收集时,所有变量都必须是集合。
几个简单的例子:
(1)在SELECT语句中使用批量收集。
复制代码代码如下所示:
声明
型sallist表员工工资的百分之式;
课后sallist;
开始
选择薪酬体收集到从员工那里rownum <=销售50;
-然后使用集合中的数据
结束;
/
(2)使用批量收集获取
复制代码代码如下所示:
声明
型deptrectab是部门%ROWTYPE表;
dept_recs deptrectab;
光标选择department_id,从部门里的department_id > 10 department_name;
开始
开放课程;
取当前散装收集到dept_recs;
-然后使用集合中的数据
结束;
/
(3)在返回时使用批量收集。
复制代码代码如下所示:
从员工中创建表EMP作为选择*;
声明
型numlist是表employee_id %型员工;
枚举numlist;
型名单表last_name %型员工;
名字的名单;
开始
删除EMP在department_id = 30
返回employee_id,last_name散装收集到枚举的名字;
dbms_output.put_line('deleted| | SQL %行| | 'rows:');
我在枚举。第一..enums.last
环
dbms_output.put_line('employee #| |枚举(我)| | ':' | |名字(我));
结束循环;
结束;
/
deleted6rows:
114:员工#南洲
员工# 115:邱
员工# 116:拜达
员工# 117:托拜厄斯
员工# 118:冰室
员工# 119:柯莫纳雷
创建表EMP从申报类型*员工选择;numlist是表的员工。employee_id %类型;枚举类型numlist;名单表的员工。last_name %型;名字的名单;开始删除EMP在department_id = 30返回employee_id,last_name散装收集到枚举名称;dbms_output.put_line('deleted| | SQL %行| | 'rows:');我在enums.first enums.last环。dbms_output.put_line('employee #| |枚举(我)| | ':' | |名字(我));循环结束;结束/ deleted6rows:员工# 114:raphaelyemployee # 115:khooemployee # 116:baidaemployee # 117:tobiasemployee # 118:himuroemployee # 119:Colmenares;
删除更新批量收集数据的优化
你可以在这里删除,更新是一样的。
受理案件:
您需要在1亿行的大表中删除1000万行数据。
当数据库的其他应用程序的影响最小时,需要以最快的速度完成需求。
如果企业不能停止,你可以参考以下想法:
根据rowid片,rowid排序,批量处理回用,回表的删除
当企业不能停止时,这是最好的选择。
通常控制在每一万行提交一次,不会对回滚部分造成太大压力。
When I'm doing a big DML, I usually choose one thousand or two thousand lines and one submission
当您选择在低峰值时做生意时,它不会对应用程序产生很大的影响。
代码如下:
复制代码代码如下所示:
声明
---光标按ROWID
-删除条件是基于实际情况的
游标游标是选择从哪里OO = XX rowid为ROWID;
型rowid_table_type是pls_integer rowid指数表;
v_rowid rowid_table_type;
开始
打开游标;
环
把游标散装收集到v_rowid限5000——5000线提交;
v_rowid数= 0时退出;
就我在v_rowid第一.. v_rowid.last。
删除T,rowid = v_rowid(我);
承诺;
结束循环;
关闭游标;
结束;
/
从记录限制中提取的批量收集的数量
Grammar:
获取游标批量收集到…{限制行};
在这种情况下,行可以是常量,而变量或评价的结果是整数的表达式。
假设你需要查询和处理1w线数据,你可以使用散装收集把所有行一次,然后填写到一个非常大的收集。
然而,这种方法将消耗大量的PGA会话,应用程序可能是因为PGA饲料性能下降。
此时,限制子句非常有用,它帮助我们控制程序用来处理数据的内存量。
实例uff1a
复制代码代码如下所示:
声明
光标allrows_cur是SELECT * FROM员工;
型employee_aat是allrows_cur %ROWTYPE指数binary_integer表;
v_emp employee_aat;
开始
打开allrows_cur;
环
取allrows_cur批量提取到v_emp限制100;
通过扫描数据收集/处理。
我在1…v_emp.count
环
upgrade_employee_status(v_emp(我)。employee_id);
结束循环;
退出时未allrows_cur %;
结束循环;
近allrows_cur;
结束;
/
间歇萃取塔
需求:
在运输表中提取不到20公里/人民币的交通信息。
代码如下:
复制代码代码如下所示:
声明
-声明集类型
型vehtab是运输%ROWTYPE表;
-初始化这种类型的集合
gas_quzzlers vehtab;
开始
选择从哪里gas_quzzlers散装收集到运输里程<20;
…
根据使用返回子句的批处理操作
与回归的条款,我们可以很容易地确定刚刚竣工的DML操作的结果没有任何额外的查询工作
例如,请参见批量收集使用的第三个点。
通过对两加快DML
所有的PL / SQL引擎告诉绑定一个或多个设置SQL语句前的所有成员,然后发送语句的SQL引擎
1语法
待续…