sql >> Database >  >> RDS >> Oracle

Efficiëntie van de driemaandelijkse berekening van het personeelsbestand

Lijkt een goede variant te zijn als er index is op ten minste effective_start_date en effective_end_date velden van per_all_people_f tafel.

Ideale variant voor deze zoekopdracht is

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

maar het kan te duur zijn om te onderhouden (schijfkosten, invoegsnelheid).

De cursor in de hoofdtekst van het pakket moet ook subquery- en functieaanroepresultaten voor hergebruik bevatten:

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

De beste oplossing is natuurlijk om contextwisselingen te minimaliseren en alle waarden uit een enkele SQL-query te halen. U kunt ook parameters rechtstreeks aan de cursor leveren:

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

Vanuit mijn oogpunt zijn functie-/cursorparameters te generiek, het is misschien beter om een ​​wrapper te maken die als invoerparameters een kwartaalnummer en twee jaar nodig heeft om te vergelijken.

En als laatste, als resultaten gepland zijn om te worden gebruikt in PL/SQL (ik veronderstel dat vanwege het retourneren van een enkele rij) helemaal geen cursor gebruiken, retourneer dan gewoon berekende waarden via uitvoerparameters. Vanuit een ander oogpunt, als u kwartaalgegevens voor het hele jaar in één cursor wilt krijgen, kan het efficiënter zijn om alle kwartalen te tellen en deze in één zoekopdracht te vergelijken.




  1. SQLite3 (of algemene SQL) haalt de n-de rij van een queryresultaat op

  2. SQL meervoud/enkelvoud zoekopdrachten

  3. Best Practice voor het maken van indexen op uw MySQL-tabellen - Rolling Index Builds

  4. Voorbeeld Oracle-functie (retournummer)