从Oracle8开始,oracle为PL/SQL引入了两个新的数据操纵语言(DML)语句:BULK COLLECT和FORALL。这两个语句在PL/SQL内部进行一种数组处理;BULK COLLECT提供对数据的高速检索,FORALL可大大改进INSERT、UPDATE和DELETE操作的性能。Oracle数据库使用这些语句大大减少了PL/SQL与SQL语句执行引擎的环境切换次数,从而使其性能有了显著提高。
现在就用实践证明for..loop循环语句和forall在执行性能上的区别
例子中使用到的type ... is table of ....这里先不做解释,以后讲BULK COLLECT会详细提到
1.创建空表
create table test(sid int,uname varchar2(20));
2.创建过程计算时间
create or replace procedure get_time(count_time out number)
is
begin
select to_char(sysdate,'mmmmmmm') into count_time from dual;
end;
3.创建过程分别用FOR.. LOOP语句和FORALL向表中插入100万条记录
create or replace procedure time_of_for_and_forall
is
type sid_type is table of fw.test.sid%type index by pls_integer;
sid_var sid_type;
type uname_type is table of fw.test.uname%type index by pls_integer;
uname_var uname_type;
count_time1 char(10);
count_time2 char(10);
count_time3 char(10);
begin
for i in 1..1000000 loop
sid_var(i) := i;
uname_var(i) := to_char(i);
end loop;
fw.get_time(count_time1);
for j in 1..1000000 loop
insert into fw.test values(sid_var(j),uname_var(j));
end loop;
commit;
fw.get_time(count_time2);
forall k in 1..1000000
insert into fw.test values(sid_var(k),uname_var(k));
commit;
fw.get_time(count_time3);
dbms_output.put_line('使用for循环插入100万条数据所花的时间为'
||to_number(count_time2-count_time1));
dbms_output.put_line('使用forall循环插入100万条数据所花的时间为'
||to_number(count_time3-count_time2));
end;
3.然后调用上面的过程
declare
begin
fw.time_of_for_and_forall;
end;
在我的机器上输出的结果是
使用for循环插入100万条数据所花的时间为201
使用forall循环插入100万条数据所花的时间为21
同样你也可以直接在sql*plus里直接比较2个匿名块的执行时间
set timing on
使用for循环
declare
type sid_type is table of fw.test1.sid%type index by pls_integer;
sid_var sid_type;
type uname_type is table of fw.test1.uname%type index by pls_integer;
uname_var uname_type;
begin
for i in 1..1000000 loop
sid_var(i) := i;
uname_var(i) := to_char(i);
end loop;
for k in 1..1000000 loop
insert into fw.test2 values(sid_var(k),uname_var(k));
end loop;
commit;
end;
/
使用forall循环
declare
type sid_type is table of fw.test1.sid%type index by pls_integer;
sid_var sid_type;
type uname_type is table of fw.test1.uname%type index by pls_integer;
uname_var uname_type;
begin
for i in 1..1000000 loop
sid_var(i) := i;
uname_var(i) := to_char(i);
end loop;
forall k in 1..1000000
insert into fw.test2 values(sid_var(k),uname_var(k));
commit;
end;
/
在SQL*PLUS里输出的时间结果是
使用forall: 00: 00: 31.04
使用for: 00: 03: 28.08
分享到:
相关推荐
下面是一个使用 `FOR` 循环和 `FORALL` 进行数据插入的对比示例,展示批挷定对性能的影响: ```sql DECLARE TYPE NumTab IS TABLE OF parts.pnum%TYPE INDEX BY BINARY_INTEGER; TYPE NameTab IS TABLE OF parts....
Basic(Beginner's All-purpose Symbolic Instruction Code)是一种高级编程语言,设计初衷是为了让初学者能够轻松学习编程。自1964年首次出现以来,Basic经历了多个版本和演变,包括Visual Basic、QBasic、Pascal-...
了解其常用控制语句的基本用法对于创建动态和交互性的内容至关重要。以下是对这些基本用法的详细说明: 1. **Goto**:`Goto`语句用于跳转到指定的帧。可以指定帧的编号、标号或通过表达式计算的帧。配合`Play`或`...
- `FOR`循环中使用了`PIPEROW`语句来逐步返回数据。 - `DBMS_LOCK.SLEEP(1)`函数用于模拟耗时操作,让每次迭代之间有1秒的延迟。 - 最后的`RETURN`语句用于表示函数的处理过程已完成。 ##### 3. 调用管道函数 调用...
2. **控制结构**:VBScript支持条件语句(If...Then...Else)、循环语句(For...Next、Do...Loop)以及选择性结构(Select Case)。例如,一个简单的条件判断可能如下所示: ``` If x > 10 Then MsgBox "x is ...
因此,应该使用FOR ALL Entries 语句代替loop 语句。 14. 正确地使用 where 语句,使查询能使用索引 在ABAP程序中,where 语句可以提高查询的性能。因此,应该正确地使用where 语句,使查询能使用索引。 提高ABAP...
在C语言编程中,BASIC(Beginner's All-purpose Symbolic Instruction Code)函数的一些特性往往让人怀念,因为它们简洁易用。本主题旨在探讨如何在C语言中模仿BASIC的一些常见函数,以便让C程序更加易读和简洁,...
在PL/SQL编程环境中,集合操作BULK COLLECT和FORALL是提高数据库处理效率的关键特性。它们主要用于批量处理数据,减少数据库调用次数,从而优化性能。这些特性尤其适用于处理大量数据时,如循环遍历结果集并进行更新...
- **FOR_LOOP语句**:`FOR 循环变量 IN 循环次数范围 LOOP ... END LOOP;` 它们用于重复执行一段代码,直到满足特定条件或执行固定次数。 6. **NEXT语句**:用于控制循环的流程,无条件地结束当前循环,跳回循环...
循环结构包括`LOOP`、`WHILE`、`FOR`、`REPEAT`和`FORALL`等。 ###### 4.3.1 LOOP 语句 ```sql LOOP -- ... EXIT WHEN v_age > 30; END LOOP; ``` ###### 4.3.2 WHILE 语句 ```sql WHILE v_age < 30 LOOP -- ...
它支持变量声明、算术运算、逻辑控制结构如条件语句和循环语句,并提供丰富的内置函数供开发者使用。 #### 变量声明 在VBS中,可以使用`Dim`关键字来声明变量,例如: ```vbscript Dim a, b ``` #### 输入与输出...
- **FOR...ENDFOR**: 另一种循环语句,基于特定范围或列表进行迭代。 - **LOOP**: 继续执行最近的DO WHILE循环,即使其后的条件测试失败。 - **EXIT**: 立即退出循环,跳过剩余的循环体。 ### 4. 系统与内存管理 -...
当遇到字符 "h" 时,continue 语句跳过本次循环,不打印 "h"。 **2. 请写出下列程序的输出结果:** ```python n = 1 def func(a, b): n = b return a * b s = func("Hello~", 2) print(s, n) ``` - 输出结果为...
- **使用FIELD SYMBOLS**:使用FIELD SYMBOLS可以提高程序灵活性和性能。 - **使用INTO TABLE而非INTO CORRESPONDING FIELDS OF TABLE**:使用`INTO TABLE`代替`INTO CORRESPONDING FIELDS OF TABLE`。 - **避免使用...
- `for loop...end`: 循环结构。 - `while loop...end`: 当条件满足时持续循环。 - `break`: 退出当前循环。 - `continue`: 跳过当前循环剩余部分,继续下一轮循环。 6. **函数与匿名函数** - `function ...
例如,下面的示例比较了使用FOR循环和FORALL循环插入数据的性能差异: ```sql -- 使用FOR循环 FOR i IN 1..500000 LOOP INSERT INTO parts VALUES(pnums(i), pnames(i)); END LOOP; -- 使用FORALL循环 FOR...
在ABAP环境中,SQL语句的性能优化是提高系统响应速度和资源利用效率的关键环节。本文将基于给定的代码片段,深入探讨两种不同的SQL查询方法,并分析它们在性能上的差异,以帮助开发者理解如何编写更高效、更经济的...
- `Do...Loop`:根据条件执行循环。 - **选择结构**:`Select Case` 用于多条件分支选择。 **3. 函数与过程** - **Sub**:子程序,不返回值。 - **Function**:函数,可返回一个值。 - **参数传递**:支持按值和...
1. **批量处理**:使用FOR ALL ENTRIES IN进行批量处理可以避免多次循环查询。 - **原始写法**: ```abap Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. ...
模块化设计语句如process、component、generate、block以及for...loop和子程序调用语句,用于构建复杂的设计结构。仿真语句如wait则用于描述延迟和仿真时的行为。 在执行方式上,VHDL语句分为并行语句和顺序语句。...