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

后端 未结 12 847
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:46

    I would not use an explicit cursor to do this. Steve F. no longer advises people to use explicit cursors when an implicit cursor could be used.

    The method with count(*) is unsafe. If another session deletes the row that met the condition after the line with the count(*), and before the line with the select ... into, the code will throw an exception that will not get handled.

    The second version from the original post does not have this problem, and it is generally preferred.

    That said, there is a minor overhead using the exception, and if you are 100% sure the data will not change, you can use the count(*), but I recommend against it.

    I ran these benchmarks on Oracle 10.2.0.1 on 32 bit Windows. I am only looking at elapsed time. There are other test harnesses that can give more details (such as latch counts and memory used).

    SQL>create table t (NEEDED_FIELD number, COND number);
    

    Table created.

    SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
    

    1 row created.

    declare
      otherVar  number;
      cnt number;
    begin
      for i in 1 .. 50000 loop
         select count(*) into cnt from t where cond = 1;
    
         if (cnt = 1) then
           select NEEDED_FIELD INTO otherVar from t where cond = 1;
         else
           otherVar := 0;
         end if;
       end loop;
    end;
    /
    

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:02.70

    declare
      otherVar  number;
    begin
      for i in 1 .. 50000 loop
         begin
           select NEEDED_FIELD INTO otherVar from t where cond = 1;
         exception
           when no_data_found then
             otherVar := 0;
         end;
       end loop;
    end;
    /
    

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:03.06

提交回复
热议问题