Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Effizienz der vierteljährlichen Berechnung des Personalbestands

Scheint eine gute Variante zu sein, falls der Index mindestens am effective_start_date vorhanden ist und effective_end_date Felder von per_all_people_f Tabelle.

Ideale Variante für diese Abfrage ist

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

aber die Wartung kann zu teuer sein (Festplattenkosten, Einfügungsgeschwindigkeit).

Außerdem muss der Cursor im Paketkörper Unterabfragen enthalten und Ergebnisse von Funktionsaufrufen wiederverwenden:

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
  );

Die beste Lösung ist natürlich, Kontextwechsel zu minimieren und alle Werte aus einer einzigen SQL-Abfrage zu erhalten. Außerdem können Sie Parameter direkt an den Cursor übergeben:

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
  );

Aus meiner Sicht sind Funktions-/Cursor-Parameter zu generisch, vielleicht ist es besser, einen Wrapper zu erstellen, der als Eingabeparameter die Quartalszahl und zwei Jahre zum Vergleichen verwendet.

Und zuletzt, wenn Ergebnisse, die für die Verwendung in PL/SQL geplant sind (ich nehme an, dass wegen der Rückgabe einer einzelnen Zeile), den Cursor überhaupt nicht verwenden, geben Sie einfach berechnete Werte über Ausgabeparameter zurück. Aus einem anderen Blickwinkel, wenn Sie Quartalsdaten für das gesamte Jahr in einem Cursor erhalten müssen, kann es effizienter sein, alle Quartale zu zählen und in einer einzigen Abfrage zu vergleichen.