sql >> Databasteknik >  >> RDS >> Oracle

Effektivitet av kvartalsberäkning av personalstyrka

Verkar vara en bra variant om det finns index på åtminstone effective_start_date och effective_end_date fält av per_all_people_f bord.

Idealisk variant för denna fråga är

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 vara för dyrt att underhålla (diskkostnad, insättningshastighet).

Dessutom måste markören i paketets kropp innehålla underfråga och återanvända funktionsanropsresultat:

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

Naturligtvis är bästa lösningen att minimera kontextväxlingar och få alla värden från en enda SQL-fråga. Du kan också ange parametrar direkt till 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
  );

Ur min synvinkel är funktion/markörparametrar för generiska, kan vara bättre att skapa ett omslag som tar som indataparametrar kvartalsnummer och två år att jämföra.

Och sist, om resultaten planerade att användas i PL/SQL (jag antar att på grund av att en enda rad returneras) inte använder markören alls, returnera bara beräknade värden genom utdataparametrar. Ur en annan synvinkel kan det vara mer effektivt att räkna alla kvartal och jämföra dem i en enda fråga om du behöver få kvartalsdata för hela året med en markör.




  1. MAX() i ORACLE SQL

  2. JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() i SQLite

  3. Oracle - Välj var fältet har gemener

  4. Hur fungerar SQLs DISTINCT-sats?