如果有个大数据量的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 使用量.
原因 4 为证明 当一个大数据量的insert 会超级慢,如果分批插入的总时间 比一次插入省很多时间.