采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。
可以在select into,fetch into,returning into语句使用bulk collect。
注意在使用bulk collect时,所有的into变量都必须是collections.
如果有个大数据量的DML操作事务,在OLAP报表等低并发库里. 并且强制归档模式中.
采用BULK 和FORALL 会比较快!
-
open cur_COLUMN_USER;
-
loop
-
fetch cur_COLUMN_USER bulk collect
-
into
-
l_ARY_statedate,
-
l_ARY_form,
-
l_ARY_columnid,
-
l_ARY_usernumber,
-
l_ARY_new_user,
-
l_ARY_exit_use
-
limit g_batch_size_n;
-
-
forall i in 1..l_ARY_statedate.count
-
insert into content_lst_day
-
(......)
-
values(l_ary_statedate(i),....);
-
-
commit;
-
end loop;
-
相对使用普通游标循环提取数据出来处理的话 会快很多.
原因 1 bulk collect into 到数组 可以一次型把数据提取出来,减少了循环当中PL/SQL和SQL引撑的切换时间
原因 2 forall in ..... 也是一次型提交数据到某个地方 也同样减少了循环当中PL/SQL和SQL引撑的切换时间
注意 1 数据太大 要设置合理的LIMIT 否则提取到数组的数据会爆了PGA的回话内存
原因 3 bulk 内部操作 对insert delete 做了优化 采用批量方法.极大减少了redo 和Undo 使用量