oracle中bulk,Oracle——Bulk

oracle中bulk,Oracle——Bulk需求 向一张表插入 1 百万的数据 用存储过程实现 测试 用第一种实现用了 30S 如果改为 bulk 实现 不到 2s sql gt droptabletpu 表已删除 sql gt settimingons gt createtablet xint sql gt beginforiin1 loopexecutei inse

需求:向一张表插入1百万的数据,用存储过程实现。

测试:用第一种实现用了30S,如果改为bulk实现,不到2s。

sql> drop table t purge;

表已删除。

sql> set timing on

sql> create table t (x int);

sql> begin

for i in 1..

loop

execute immediate ‘insert into t values(:x)’ using i;

end loop;

commit;

end;

/

@H_403_28@

@H_403_28@

PL/sql 过程已成功完成。

已用时间: 00: 00: 30.24

sql> truncate table t;

表被截断。

sql> DECLARE

TYPE V_X IS table of t%rowtype;

records V_X;

cursor cur_query is select rownum x from dual connect by level <=;

begin

open cur_query;

loop

fetch cur_query bulk collect into records LIMIT ;

FORALL i in 1 .. records.count

INSERT INTO T values records(i);

exit when cur_query%notfound;

end loop;

commit;

end;

/

@H_403_28@

@H_403_28@

已用时间: 00: 00: 01.48

优化原理:

使用2个引擎来执行和代码块:引擎和PL/sql引擎,语句会导致在两个引擎之间进行context switch,从而影响性能。

2.从本质上讲,使用特殊的block或者subprogram来降低context switches可以提高性能。当语句在loop内使用collection elements作为bind variables来运行时,就会产生大量的context switches。与bulk相关的有2个语法:forall和bulk collect。

FORALL:将数据打包,一次性从PL/sql引擎发送给引擎。

bulk collect:将处理之后的结果集放到bulk collect里,然后一次性把bulk collect从引擎发送给PL/sql引擎。

因为bulk减少2个引擎之间的context switches,从而提升了性能,当要处理的数据量越大,使用bulk和不使用bulk性能区别就越明显。

总结

以上是编程之家为你收集整理的Oracle——Bulk全部内容,希望文章能够帮你解决Oracle——Bulk所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216097.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午12:33
下一篇 2026年3月18日 下午12:33


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号