如题:
俺只知道forall在循环的时候,比for要好点!
但是不清楚原理。
希望各位帮忙解答下!
俺只知道forall在循环的时候,比for要好点!
但是不清楚原理。
希望各位帮忙解答下!
解决方案 »
- 这条sql怎么改?
- oracle共享池更改大小求解
- 创建oracle用户
- Oracle的学习请教
- 关于oracle数据库查询与JDBC的问题
- ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务
- 小弟是新手﹐想要Select , Insert ,update ,delete 的語法。
- 如何能把一个数字加上千分号,如99999变成99,999
- 请教关于weblogic10.3运行两天左右就必须重启的问题
- oracle 想写一个自定义函数,求大佬解决
- 执行pl/sql块,出现:数据类型不一致: 应为 DATE, 但却获得 NUMBER
- sqlserver-oracle移植产生的一系列问题!
而forall 可批量处理数据,大大提高性能和速度。
例如:如果你要插入5000条数据,一般情况下,在pl/sql中用for循环,循环插入5000次,
而用forall一次就可以插入5000条,提高了性能和速度
但是原理是什么,貌似没讲哦!呵呵! 1: forall肯定还有其不足的地方。如果不是的话,Oracle中就不会有for的存在了。
2: 而是将所有的for都换成forall了!
这之间肯定是有原因的。
在发送语句到SQL引擎前,FORALL语句告知PL/SQL 引擎批挷定输入集合。尽管FORALL语句包含一个迭代(iteration)模式,它并不一是个FOR循环。其语法为:
FORALL index IN lower_bound..upper_bound
sql_statement; 在SQL语句中,为PL/SQL变量指定值称为挷定(binding),
DML语句能传递所有集合元素到一个单个操作中,这过程称为批挷定(bulk binding)。
如果集合有20个元素,批挷定让你用单个操作等效于执行与20个SELECT,INSERT,UPDATE或DELETE语句。这个技术通过减少在PL/SQL和SQL引擎(engines)间的上下文
切换来提高性能。批挷定包括:
1.带INSERT, UPDATE, and DELETE语句的批挷定:在FORALL语句中嵌入SQL语句
2.带SELECT语句的批挷定:在SELECT语句中用BULK COLLECT 语句代替INTO
SQL> SET SERVEROUTPUT ON
SQL> CREATE TABLE parts (pnum NUMBER(4), pname CHAR(15));
Table created.
SQL> DECLARE
2 TYPE NumTab IS TABLE OF parts.pnum%TYPE INDEX BY BINARY_INTEGER;
3 TYPE NameTab IS TABLE OF parts.pname%TYPE INDEX BY BINARY_INTEGER;
4 pnums NumTab;
5 Pnames NameTab;
6 t1 NUMBER;
7 t2 NUMBER;
8 t3 NUMBER;
9 BEGIN
10 FOR i IN 1..500000 LOOP
11 pnums(i) := i;
12 pnames(i) := 'Part No.'||to_char(i);
13 END LOOP;
14 t1 := dbms_utility.get_time;
15
16 FOR i IN 1..500000 LOOP
17 INSERT INTO parts VALUES(pnums(i),pnames(i));
18 END LOOP;
19 t2 := dbms_utility.get_time;
20
21 FORALL i IN 1..500000
22 INSERT INTO parts VALUES(pnums(i),pnames(i));
23 t3 := dbms_utility.get_time;
24
25 dbms_output.put_line('Execution Time (secs)');
26 dbms_output.put_line('---------------------');
27 dbms_output.put_line('FOR loop: ' || TO_CHAR(t2 - t1));
28 dbms_output.put_line('FORALL: ' || TO_CHAR(t3 - t2));
29 END;
SQL> /
Execution Time (secs)
---------------------
FOR loop: 2592
FORALL: 358
PL/SQL procedure successfully completed
更深入的了解,我自己去baidu看一下了!
就此结贴!