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

Effektivitet af kvartalsvis beregning af antal ansatte

Ser ud til at være en god variant i tilfælde af, at der er indeks på mindst effective_start_date og effective_end_date felter af per_all_people_f tabel.

Ideel variant til denne forespørgsel er

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

men det kan være for dyrt at vedligeholde (diskomkostninger, indsættelseshastighed).

Desuden skal markøren i pakketeksten indeholde underforespørgsel og genbruge funktionsopkaldsresultater:

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

Den bedste løsning er selvfølgelig at minimere kontekstskift og få alle værdier fra en enkelt SQL-forespørgsel. Du kan også angive parametre direkte til markøren:

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

Fra mit synspunkt er funktions-/markørparametre for generiske, det kan være bedre at lave en indpakning, der tager som inputparametre kvartalsnummer og to år at sammenligne.

Og sidst, hvis resultater, der er planlagt til at blive brugt i PL/SQL (jeg formoder, at på grund af at returnere en enkelt række) slet ikke bruger markøren, skal du bare returnere beregnede værdier gennem outputparametre. Fra et andet synspunkt, hvis du har brug for at få kvartalsdata for hele året i én markør, kan det være mere effektivt at tælle alle kvartaler og sammenligne dem i en enkelt forespørgsel.




  1. Bedre måde at vælge alle kolonner fra første tabel og kun én kolonne fra anden tabel på indre joinforbindelse

  2. Hvordan henter man poster for de sidste 30 minutter i MS SQL?

  3. Indstil et cron-job til at opdatere artikeloplysninger afhængigt af dets stemmeværdier

  4. Spring Data ser ikke ud til at forstå @Column name