bulk collect forall

采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。
可以在select into,fetch into,returning into语句使用bulk collect。
注意在使用bulk collect时,所有的into变量都必须是collections.

如果有个大数据量的DML操作事务,在OLAP报表等低并发库里. 并且强制归档模式中.

采用BULK 和FORALL 会比较快!

  1. open cur_COLUMN_USER;
  2.  loop
  3.  fetch cur_COLUMN_USER bulk collect
  4.  into
  5.  l_ARY_statedate,
  6.  l_ARY_form,
  7.  l_ARY_columnid,
  8.  l_ARY_usernumber,
  9.  l_ARY_new_user,
  10.  l_ARY_exit_use
  11.  limit g_batch_size_n; 
  12.  
  13.  forall i in 1..l_ARY_statedate.count
  14.  insert into content_lst_day
  15.  (......)
  16.  values(l_ary_statedate(i),....);
  17.   
  18.  commit; 
  19. end loop; 
  20.  
    相对使用普通游标循环提取数据出来处理的话 会快很多.

原因 1 bulk collect into 到数组 可以一次型把数据提取出来,减少了循环当中PL/SQL和SQL引撑的切换时间

原因 2 forall in ..... 也是一次型提交数据到某个地方 也同样减少了循环当中PL/SQL和SQL引撑的切换时间

注意 1 数据太大 要设置合理的LIMIT 否则提取到数组的数据会爆了PGA的回话内存

原因 3 bulk 内部操作 对insert delete 做了优化 采用批量方法.极大减少了redo 和Undo 使用量

https://blog.csdn.net/whhitgen/article/details/12511395

原文地址:https://www.cnblogs.com/jgmor/p/11608623.html