首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在oracle中,sql比plsql快吗?

在oracle中,sql比plsql快吗?
EN

Stack Overflow用户
提问于 2019-09-11 21:36:13
回答 2查看 433关注 0票数 0

使用批量收集还是普通合并进行更新?

我正在尝试使用批量收集和普通合并来检查更新的性能。我发现当我们在匿名块中使用简单的合并时,性能会更好。当我使用批量收集时,它需要更多的时间。

如果普通更新(合并)比批量收集更快,那么为什么oracle要引入它?我们实际上在哪里看到了批量收集的好处?

代码语言:javascript
运行
复制
declare 
l_start integer;
l_end integer;
begin
l_start := dbms_utility.get_time;
merge into test111 t1
using test112 t2
on (t1.col1 = t2.col3)
when matched then update 
set t1.col2 = t1.col2*5;
l_end := dbms_utility.get_time;
dbms_output.put_line(l_end - l_start);
end;
代码语言:javascript
运行
复制
declare
type nt_test is table of test112.col3%TYPE;
nt_val nt_test := nt_test();
cursor c is select col3 from test112;
c_limit integer := 100;
l_start integer;
l_end integer;
begin
l_start := DBMS_UTILITY.get_time;
open c;
loop

fetch c 
bulk collect into nt_val limit c_limit;
exit when nt_val.count = 0;

forall i in indices of nt_val
update test111 set col2 = col2/ 5
where col1 = nt_val(i);
commit;

end loop;
l_end := dbms_utility.get_time;
dbms_output.put_line(l_end - l_start);
end;

我在合并查询中获得0.797秒,在批量收集时获得171.352秒

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-11 21:45:18

如果你可以用SQL来做,那么用SQL来做几乎总是更有效。如果您必须求助于PL/SQL,因为您正在执行一些受益于过程代码的处理,那么执行bulk collectforall将比老式的逐行处理效率更高(不过,如果您使用隐式游标,则最新版本的Oracle将在幕后自动执行bulk collect,因此差异不会像以前那么大)。

在您的测试中,我希望循环中的提交能够解决运行时的大部分差异。显然,这在功能上与SQL解决方案不同。

票数 7
EN

Stack Overflow用户

发布于 2019-09-12 21:31:39

如果你可以用SQL来做,它总是会更快,但即使是171.352也是非常高的价值。所以我做了我的测试,我在test111(col1)上添加了一个索引,使用相同的pl/sql块,它在0.20秒内就完成了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57890447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档