Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle PL/SQL - Apakah Pengecualian NO_DATA_FOUND buruk untuk kinerja prosedur tersimpan?

Saya tidak akan menggunakan kursor eksplisit untuk melakukan ini. Steve F. tidak lagi menyarankan orang untuk menggunakan kursor eksplisit ketika kursor implisit dapat digunakan.

Metode dengan count(*) tidak aman. Jika sesi lain menghapus baris yang memenuhi kondisi setelah baris dengan count(*) , dan sebelum baris dengan select ... into , kode akan mengeluarkan pengecualian yang tidak akan ditangani.

Versi kedua dari kiriman asli tidak memiliki masalah ini, dan umumnya lebih disukai.

Yang mengatakan, ada overhead kecil menggunakan pengecualian, dan jika Anda 100% yakin data tidak akan berubah, Anda dapat menggunakan count(*) , tapi saya sarankan untuk tidak melakukannya.

Saya menjalankan tolok ukur ini di Oracle 10.2.0.1 pada Windows 32 bit . Saya hanya melihat waktu yang telah berlalu. Ada rangkaian uji lain yang dapat memberikan detail lebih lanjut (seperti jumlah kait dan memori yang digunakan).

SQL>create table t (NEEDED_FIELD number, COND number);
SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
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;
/
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;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membagi jumlah menggunakan koma di Oracle

  2. Semantik CHAR dan ORA-01461

  3. Bagaimana cara mengatasi ORA-29471 di dbms_sql.open_cursor?

  4. Aplikasi Qt mogok saat menggunakan driver ODBC (macOS)

  5. Oracle 11g di Mac OS X