sql >> Databáze >  >> RDS >> Oracle

Efektivita čtvrtletního výpočtu počtu zaměstnanců

Zdá se, že je to dobrá varianta v případě, že existuje index alespoň effective_start_date a effective_end_date pole per_all_people_f tabulka.

Ideální varianta pro tento dotaz je

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

ale může být příliš nákladná na údržbu (cena disku, rychlost vkládání).

Kurzor v těle balíčku také musí obsahovat výsledky poddotazu a opětovného použití funkce:

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

Nejlepším řešením je samozřejmě minimalizovat přepínání kontextu a získat všechny hodnoty z jediného SQL dotazu. Také můžete zadat parametry přímo kurzoru:

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

Z mého pohledu jsou parametry funkce/kurzoru příliš obecné, může být lepší vytvořit obal, který jako vstupní parametry vezme čtvrtletní číslo a dva roky pro srovnání.

A konečně, pokud výsledky plánované pro použití v PL/SQL (předpokládám, že kvůli vrácení jednoho řádku) vůbec nepoužívají kurzor, pouze vracejí vypočítané hodnoty prostřednictvím výstupních parametrů. Z jiného úhlu pohledu, pokud potřebujete získat údaje za čtvrtletí za celý rok jedním kurzorem, může být efektivnější spočítat všechna čtvrtletí a porovnat je v jediném dotazu.




  1. RLIKE rozlišují velká a malá písmena

  2. @Temporal(TemporalType.DATE) s Oracle 12

  3. Spouštění úloh údržby databáze SQL pomocí SQLCMD

  4. Chyba Mysql „Došlo k chybě -1 z modulu úložiště“.