在PL/SQL批处理语句的一个简短的讨论:批量收集所有优化的贡献
2023-12-02 23:43:41
我们知道,在SQL SQL程序中运行SQL语句是开销很大的,因为SQL语句将提交给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语法 待续…tag:优化 批处理 语句 简短 批量
相关内容