Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Eficiência do cálculo trimestral do quadro de funcionários


Parece ser uma boa variante caso haja índice em pelo menos effective_start_date e effective_end_date campos de per_all_people_f tabela.

A variante ideal para esta consulta é
create index x_per_all_people_search on per_all_people_f(   
  effective_start_date,
  effective_end_date, 
  person_id,  
  emp_flag
)

mas pode ser muito caro para manter (custo do disco, velocidade de inserção).

Além disso, o cursor no corpo do pacote deve conter os resultados da subconsulta e da chamada de função de reutilização:
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
  );

Claro que a melhor solução é minimizar as trocas de contexto e obter todos os valores de uma única consulta SQL. Além disso, você pode fornecer parâmetros diretamente ao cursor:
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
  );

Do meu ponto de vista, os parâmetros de função/cursor são muito genéricos, pode ser melhor criar um wrapper que leve como parâmetros de entrada o número do quarto e dois anos para comparar.

E por último, se os resultados planejados para serem usados ​​em PL/SQL (suponho que por causa do retorno de uma única linha) não use cursor, apenas retorne valores calculados por meio de parâmetros de saída. De outro ponto de vista, se você precisar obter dados trimestrais para o ano inteiro em um cursor, pode ser mais eficiente contar todos os trimestres e compará-los em uma única consulta.