--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;
/
2条答案
按热度按时间xurqigkl1#
异常处理不会直接造成性能问题。在PL/SQL中引发和捕获异常比简单加法慢大约100倍,但只要不生成数十亿个异常,性能就不会成为问题。性能问题一定出在代码的其他地方,因此应考虑完全删除异常处理程序。
演示异常处理的快速性
下面的代码显示了一百万个被零除的异常可以在一秒钟内引发并捕获。
什么是慢?
很可能是异常处理程序中的其他内容导致了问题。调用
DBMS_OUTPUT.PUT_LINE
的开销可能非常大,具体取决于IDE。如果IDE启用了服务器输出,并且一次读取一行输出,阅读输出可能需要很长时间。为什么还要处理异常?
您可能需要彻底重新考虑您的异常处理策略。为什么要有任何自定义异常处理呢?如果您的代码什么也不做,默认情况下,异常将被引发,传播到应用程序的顶部,并显示完整的错误堆栈和正确的行号。您的自定义异常处理程序不会包括完整的错误堆栈,不会报告正确的行号,如果服务器输出被禁用,则不会显示任何内容。
为什么这是一个如此常见的错误?
许多PL/SQL异常处理示例都是错误的,因此很容易复制这些错误。我认为这是因为开发人员希望在培训示例中使用尽可能简单的代码是正确的,但PL/SQL异常处理通常只在复杂的场景中有用。
p3rjfoxz2#
我有完全相同的问题。我知道这个线程是旧的,但如果每个异常都有一个RAISE,它的工作速度很快(3秒)。如果任何一个RAISE被注解,该过程运行约90秒:-|(没有错误,所有的行都被正确处理了)仍然在寻找如何克服这个明显的oracle bug。
没有工具来检查这是否是问题所在-https://nenadnoveljic.com/blog/pl-sql-exception-handling-performance-degradation-oracle-12-2/我使用的是v19.0