【问题标题】:does exception affect execution time?异常会影响执行时间吗?
【发布时间】:2021-09-25 05:25:44
【问题描述】:

我有一个程序链接到其他程序(不是我的程序)。 执行后 这需要很长时间(超过1小时)。 我尝试搜索问题,直到我尝试删除使用的异常。

从两个过程中删除异常后 执行时间仅持续几秒钟。 所以我的问题是使用:

EXCEPTION 
 WHEN OTHERS

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

【问题讨论】:

  • 你的说法是什么,有什么例外?
  • 不,引发异常不是性能问题(假设处理程序不执行任何长时间运行的代码)。所以这似乎只是一个巧合,你的代码被其他一些瞬态事件阻塞了。
  • 同意@APC ,异常不会影响性能,当没有其他用户使用您的设置时,您可以尝试再次检查吗

标签: oracle performance exception plsql


【解决方案1】:

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

证明异常处理速度很快

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

--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 异常处理通常只在复杂场景中有用。

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多