oracle 异常是否影响执行时间?

inkz8wg9  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(118)

我有一个链接到其他过程(不是我的过程)的过程。执行它后需要很长时间(超过1个小时)。我尝试搜索这个问题,直到我试图删除使用的异常。
从两个过程中删除异常后,执行时间只持续几秒。所以我的问题是使用:

EXCEPTION 
 WHEN OTHERS

影响执行时间那么多或者它到底有什么问题?ps:第一个EXCEPTION WHEN OTHERS之后的行就是DBMS_OUTPUT.PUT_LINE(SQLCODE||' <--> '||SQLERRM);。第二个例外是RAISE ;

xurqigkl

xurqigkl1#

异常处理不会直接造成性能问题。在PL/SQL中引发和捕获异常比简单加法慢大约100倍,但只要不生成数十亿个异常,性能就不会成为问题。性能问题一定出在代码的其他地方,因此应考虑完全删除异常处理程序。

演示异常处理的快速性

下面的代码显示了一百万个被零除的异常可以在一秒钟内引发并捕获。

--1 million exceptions: 1.4 seconds
declare
    v_count number := 0;
begin
    for i in 1 .. 1000000 loop
        begin
            v_count := v_count + 1/0;
        exception when others then
            null;
        end;
    end loop;
    dbms_output.put_line('Number: ' || v_count);
end;
/
--1 million additions: 0.03 seconds
declare
    v_count number := 0;
begin
    for i in 1 .. 1000000 loop
        begin
            v_count := v_count + 1;
        exception when others then
            null;
        end;
    end loop;
    dbms_output.put_line('Number: ' || v_count);
end;
/

什么是慢?

很可能是异常处理程序中的其他内容导致了问题。调用DBMS_OUTPUT.PUT_LINE的开销可能非常大,具体取决于IDE。如果IDE启用了服务器输出,并且一次读取一行输出,阅读输出可能需要很长时间。

为什么还要处理异常?

您可能需要彻底重新考虑您的异常处理策略。为什么要有任何自定义异常处理呢?如果您的代码什么也不做,默认情况下,异常将被引发,传播到应用程序的顶部,并显示完整的错误堆栈和正确的行号。您的自定义异常处理程序不会包括完整的错误堆栈,不会报告正确的行号,如果服务器输出被禁用,则不会显示任何内容。

为什么这是一个如此常见的错误?

许多PL/SQL异常处理示例都是错误的,因此很容易复制这些错误。我认为这是因为开发人员希望在培训示例中使用尽可能简单的代码是正确的,但PL/SQL异常处理通常只在复杂的场景中有用。

p3rjfoxz

p3rjfoxz2#

我有完全相同的问题。我知道这个线程是旧的,但如果每个异常都有一个RAISE,它的工作速度很快(3秒)。如果任何一个RAISE被注解,该过程运行约90秒:-|(没有错误,所有的行都被正确处理了)仍然在寻找如何克服这个明显的oracle bug。
没有工具来检查这是否是问题所在-https://nenadnoveljic.com/blog/pl-sql-exception-handling-performance-degradation-oracle-12-2/我使用的是v19.0

相关问题