如题:
       俺只知道forall在循环的时候,比for要好点!
       但是不清楚原理。
       希望各位帮忙解答下!

解决方案 »

  1.   

    FORALL可批量操作大大改进INSERT、UPDATE和DELETE操作的性能和速度
      

  2.   

    就是减少SQL语句和ORACLE数据库SQL执行模块交互的次数
      

  3.   

    for 是循环
    而forall 可批量处理数据,大大提高性能和速度。
    例如:如果你要插入5000条数据,一般情况下,在pl/sql中用for循环,循环插入5000次,
    而用forall一次就可以插入5000条,提高了性能和速度
      

  4.   

    forall 还有这个,哈哈,头回听说,每次来CSDN泡论坛都有收获
      

  5.   

      恩!这个我也知道!
      但是原理是什么,貌似没讲哦!呵呵!  1: forall肯定还有其不足的地方。如果不是的话,Oracle中就不会有for的存在了。
      2: 而是将所有的for都换成forall了!
      
       这之间肯定是有原因的。
      
       
       
      

  6.   

    forall 要配合集合数据类型来超做先把全部数据装进 集合内 然后forall 提交给数据库
      

  7.   

    谁知道forall的原理?请解释下!
      

  8.   

        在PL/SQL 和SQL引擎(engines)中,太多的上下文切换(context switches)会影响性能。这个会发生在当一个循环为集合中的每个元素执行一个单个SQL语句时。而使用批挷定能显著提高性能.
        在发送语句到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
      

  9.   

    下边的例子分别用FOR和FORALL进行数据插入,以显示用批挷定的对性能的提高:
    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
      

  10.   

       感谢各位的解答,对forall有了进一步的了解!
       更深入的了解,我自己去baidu看一下了!
       就此结贴!