Oracle PL/SQL - Are NO_DATA_FOUND Exceptions bad for stored procedure performance?

后端 未结 12 872
Happy的楠姐
Happy的楠姐 2021-02-03 23:14

I\'m writing a stored procedure that needs to have a lot of conditioning in it. With the general knowledge from C#.NET coding that exceptions can hurt performance, I\'ve always

12条回答
  •  花落未央
    2021-02-03 23:57

    Stephen Darlington makes a very good point, and you can see that if you change my benchmark to use a more realistically sized table if I fill the table out to 10000 rows using the following:

    begin 
      for i in 2 .. 10000 loop
        insert into t (NEEDED_FIELD, cond) values (i, 10);
      end loop;
    end;
    

    Then re-run the benchmarks. (I had to reduce the loop counts to 5000 to get reasonable times).

    declare
      otherVar  number;
      cnt number;
    begin
      for i in 1 .. 5000 loop
         select count(*) into cnt from t where cond = 0;
    
         if (cnt = 1) then
           select NEEDED_FIELD INTO otherVar from t where cond = 0;
         else
           otherVar := 0;
         end if;
       end loop;
    end;
    /
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:04.34
    
    declare
      otherVar  number;
    begin
      for i in 1 .. 5000 loop
         begin
           select NEEDED_FIELD INTO otherVar from t where cond = 0;
         exception
           when no_data_found then
             otherVar := 0;
         end;
       end loop;
    end;
    /
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:02.10
    

    The method with the exception is now more than twice as fast. So, for almost all cases,the method:

    SELECT NEEDED_FIELD INTO var WHERE condition;
    EXCEPTION
    WHEN NO_DATA_FOUND....
    

    is the way to go. It will give correct results and is generally the fastest.

提交回复
热议问题