使用BULK COLLECT+FORALL加速批量提交

一、         批量提交

批量提交特点 :

占用较少undo, 资源( 独占锁,undo) 快速释放, 执行时间长

批量提交适合场景 :

在线大批量插入, 更新, 删除数据

二、         BULK COLLECT+FORALL 性能提升

1. 通过 BULK COLLECT 加速查询

不管是显示游标还是隐式游标,都可以通过BULK COLLECT 在数据库的单次交互中获取多行数据。BULKCOLLECT 相对Cursor Loop 方式减少了PL/SQL 引擎和SQL 引擎之间的切换次数,因此也减少了提取数据时的额外开销。

2 通过 LIMIT rows 限制提取的记录数

这种方法会减少对PGA 的消耗, 避免换页产生

3 通过 FORALL 加速 DML

FORALL 告诉PL/SQL 引擎要先把一个或多个集合的所有成员都绑定到SQL 语句中,然后再把语句发送给SQL 引擎, 如果for ..loop  循环,那么会发送n( 循环的次数) 次,而用Forall ,一次行全部发送过去。

三、         BULK COLLECT + FORALL 批量提交例句

insert

TYPE ARRAY IS TABLE OF big_table%ROWTYPE;

    OPEN c;

    FETCH c BULK COLLECT INTO l_data LIMIT 5000;

    FORALL i IN 1..l_data.COUNT

    commit;

    END LOOP;

 CURSOR mycursor IS SELECT rowid FROM t WHERE OO=XX ;  

 v_rowid rowid_table_type;  

  OPEN mycursor;  

    FETCH mycursor BULK COLLECT INTO v_rowid LIMIT 5000;  

    FORALL i IN v_rowid.FIRST..v_rowid.LAST  

    COMMIT;  

  CLOSE mycursor;  

/  

DECLARE  

 TYPE num_tab_t IS TABLE OF NUMBER(38);

  OPEN mycursor;  

    FETCH mycursor BULK COLLECT INTO pk_tab LIMIT 5000;  

    FORALL i IN pk_tab.FIRST..v_rowid.LAST  

            SET    name=name||’bulk’

    COMMIT;  

  CLOSE mycursor;  

/  

 

 


请使用浏览器的分享功能分享到微信等