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

Efisiensi perhitungan triwulanan jumlah tenaga kerja

Tampaknya menjadi varian yang bagus jika ada indeks setidaknya pada effective_start_date dan effective_end_date bidang per_all_people_f tabel.

Varian ideal untuk kueri ini adalah

create index x_per_all_people_search on per_all_people_f(   
  effective_start_date,
  effective_end_date, 
  person_id,  
  emp_flag
)

tetapi perawatannya mungkin terlalu mahal (biaya disk, kecepatan penyisipan).

Juga, kursor dalam isi paket harus berisi hasil panggilan fungsi subquery dan penggunaan kembali:

cursor cur_var
is 
  select 
    EMP_2012,
    EMP_2013,
    (EMP_2013 - EMP_2012) Diff
  from (
   select 
     function_name('01-MAR-2012','31-MAY-2012') EMP_2012,
     function_name('01-MAR-2013','31-MAY-2013') EMP_2013
   from dual
  );

Tentu saja solusi terbaik adalah meminimalkan sakelar konteks dan mendapatkan semua nilai dari satu kueri SQL. Selain itu, Anda dapat memberikan parameter langsung ke kursor:

cursor cur_var(
  start_1 date, end_1 date, 
  start_2 date, end_2 date
)
is 
  select 
    EMP_2012,
    EMP_2013,
    (EMP_2013 - EMP_2012) Diff
  from (
   select 
     (
       select 
         count(distinct papf.person_id)
       from 
         per_all_people_f papf
       where 
         papf.emp_flag = 'Y'
         and 
         effective_start_date >= trunc(start_1)
         and 
         effective_end_date   <= trunc(end_1)
     ) EMP_2012,
     (
       select 
         count(distinct papf.person_id)
       from 
         per_all_people_f papf
       where 
         papf.emp_flag = 'Y'
         and 
         effective_start_date >= trunc(start_2)
         and 
         effective_end_date   <= trunc(end_2)
     ) EMP_2013
   from dual
  );

Dari sudut pandang saya, parameter fungsi/kursor terlalu umum, mungkin lebih baik untuk membuat pembungkus yang menggunakan parameter masukan angka seperempat dan dua tahun untuk dibandingkan.

Dan terakhir, jika hasil yang direncanakan untuk digunakan dalam PL/SQL (saya kira karena mengembalikan satu baris) jangan gunakan kursor sama sekali, cukup kembalikan nilai yang dihitung melalui parameter output. Dari sudut pandang lain, jika Anda perlu mendapatkan data kuartal selama setahun penuh dalam satu kursor, mungkin lebih efisien untuk menghitung semua kuartal dan membandingkannya dalam satu kueri.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ubah ukuran tipe data di sql

  2. tangkap pengecualian DB di aplikasi JSF + EJB

  3. meneruskan nama tabel sebagai parameter plsql

  4. Aturan Oracle Bankers

  5. Ekspresi Reguler Oracle. Rentang Berbahaya