簡體   English   中英

sql比oracle中的plsql快嗎

[英]is sql faster than plsql in oracle

使用批量收集或常規合並更新?

我試圖通過使用批量收集和正常合並來檢查更新的性能。 我看到當我們在匿名塊中使用簡單合並時,性能會更好。 使用批量收集時,需要花費更多時間。

如果正常更新(合並)比批量收集更快,那么oracle為什么引入它呢? 我們在哪里真正看到批量收集的好處?

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;
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秒

如果您可以在SQL中執行此操作,那么在SQL中執行此操作幾乎總是更有效。 如果你不得不求助於PL / SQL,因為你正在做一些處理,從程序代碼的好處,做bulk collectforall會比舊款行由行處理更有效(但如果你正在使用隱式游標,Oracle的最新版本將在幕后自動進行bulk collect ,因此差異不大。

在您的測試中,我希望循環中的提交能夠解決運行時中的大部分差異。 顯然,這在功能上與SQL解決方案有所不同。

如果您可以在SQL中執行此操作,它將始終更快,但是即使這樣171.352也非常有價值。 因此,我進行了測試,並在test111(col1)上添加了索引,並使用相同的pl / sql塊在0.20秒內完成了索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM