Oracle
 sql >> Database >  >> RDS >> Oracle

Efficienza del calcolo trimestrale dell'organico

Sembra essere una buona variante nel caso in cui ci siano indici almeno su effective_start_date e effective_end_date campi di per_all_people_f tabella.

La variante ideale per questa query è

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

ma potrebbe essere troppo costoso da mantenere (costo del disco, velocità di inserimento).

Inoltre, il cursore nel corpo del pacchetto deve contenere sottoquery e riutilizzare i risultati delle chiamate di funzione:

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

Ovviamente la soluzione migliore è ridurre al minimo i cambi di contesto e ottenere tutti i valori da una singola query SQL. Inoltre, puoi fornire parametri direttamente al cursore:

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

Dal mio punto di vista i parametri della funzione/cursore sono troppo generici, potrebbe essere meglio creare un wrapper che richieda come parametri di input un quarto e due anni per essere confrontati.

E infine, se i risultati pianificati per essere utilizzati in PL/SQL (suppongo che a causa della restituzione di una singola riga) non utilizzino affatto il cursore, restituiscono semplicemente i valori calcolati tramite i parametri di output. Da un altro punto di vista, se è necessario ottenere i dati trimestrali per l'intero anno in un cursore, potrebbe essere più efficiente contare tutti i trimestri e confrontarli in un'unica query.