sql >> Base de Datos >  >> RDS >> Oracle

Eficiencia del cálculo trimestral de la dotación de personal

Parece ser una buena variante en caso de que haya un índice en al menos effective_start_date y effective_end_date campos de per_all_people_f mesa.

La variante ideal para esta consulta es

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

pero puede ser demasiado costoso de mantener (costo del disco, velocidad de inserción).

Además, el cursor en el cuerpo del paquete debe contener una subconsulta y reutilizar los resultados de la llamada a la función:

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

Por supuesto, la mejor solución es minimizar los cambios de contexto y obtener todos los valores de una sola consulta SQL. Además, puede proporcionar parámetros directamente al 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
  );

Desde mi punto de vista, los parámetros de función/cursor son demasiado genéricos, puede ser mejor crear un contenedor que tome como parámetros de entrada un trimestre y dos años para comparar.

Y por último, si los resultados planeados para usarse en PL/SQL (supongo que debido a que devuelve una sola fila) no use el cursor en absoluto, solo devuelva los valores calculados a través de los parámetros de salida. Desde otro punto de vista, si necesita obtener datos trimestrales para todo el año en un solo cursor, puede ser más eficiente contar todos los trimestres y compararlos en una sola consulta.