gpt4 book ai didi

oracle - 嵌套 block 对 PL/SQL 过程中的性能有影响吗?

转载 作者:行者123 更新时间:2023-12-02 21:28:41 26 4
gpt4 key购买 nike

在 PL/SQL 过程中,我经常将语句包装在一个 block 中(即 begin...end),以便可以将异常与该语句隔离。例如,如果我正在进行一个可能引发“no_data_found”的选择,我可以在知道异常是由该语句引发的情况下处理该问题,但让其他异常传播到该过程的主异常处理程序。

我想知道这些额外的 block 是否会对性能产生影响。我知道引发异常会对性能产生影响,因此我从不依赖异常作为控制流机制。但区 block 本身有什么影响吗?

例如,以下的性能是否存在差异:

procedure do_something
as
declare
some_var number;
begin
select some_value into some_var from some_table;
exception
when others then
raise_application_error(-20000, 'Exception: ' || sqlerrm, true);
end do_something;

还有这个:

procedure do_something
as
declare
some_var number;
begin
begin
select some_value into some_var from some_table;
exception
when no_data_found then
some_var := -23; --some default value
end;
exception
when others then
raise_application_error(-20000, 'Exception: ' || sqlerrm, true);
end do_something;

(我知道这段代码是无意义的,但我希望它能说明我的意思!)

我真正关心的是没有引发异常时的性能 - 我可以接受出现异常时的性能下降。

最佳答案

他们似乎没有:

set timing on
set serveroutput on

declare
x number := 0;
begin
dbms_output.put_line('No inner blocks');
for i in 1..1000000 loop
x := x + 1;
end loop;
dbms_output.put_line(x);
end;
/

anonymous block completed
Elapsed: 00:00:00.095
No inner blocks
1000000

在同一时间运行,每种方式都有一点变化,如下:

declare
x number := 0;
begin
dbms_output.put_line('Nested inner blocks');
for i in 1..1000000 loop
begin
begin
begin
begin
x := x + 1;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
exception
when others then
raise;
end;
end loop;
dbms_output.put_line(x);
end;
/

anonymous block completed
Elapsed: 00:00:00.090
Nested inner blocks
1000000

当然,编译器可能会删除冗余层,但我不确定它是否真的可以使用异常处理程序,因为它会影响结果。

我没有看到任何关于嵌套 block 深度的限制 - 文档只是说“ block 可以嵌套”。您正在使用的模型(捕获特定错误并让其他错误传播)很好并且非常标准 - 尽管显然在您设计的示例中这是没有必要的,但您知道这一点。

关于oracle - 嵌套 block 对 PL/SQL 过程中的性能有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22833481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com