Oracle
 sql >> база данни >  >> RDS >> Oracle

Ефективност на тримесечното изчисляване на числеността на работната сила

Изглежда добър вариант в случай, че има индекс поне на effective_start_date и effective_end_date полета на per_all_people_f таблица.

Идеалният вариант за тази заявка е

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

но може да е твърде скъпо за поддръжка (цена на диска, скорост на вмъкване).

Освен това курсорът в тялото на пакета трябва да съдържа подзаявка и повторно използване на резултатите от извикване на функция:

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

Разбира се, най-доброто решение е да се минимизират контекстните превключватели и да се получат всички стойности от една SQL заявка. Освен това можете да предоставите параметри директно на курсора:

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

От моя гледна точка параметрите на функция/курсор са твърде общи, може би е по-добре да се създаде обвивка, която приема като входни параметри номер на тримесечие и две години за сравнение.

И последно, ако резултатите са планирани да бъдат използвани в PL/SQL (предполагам, че поради връщането на един ред), изобщо не използвайте курсора, просто връщайте изчислените стойности чрез изходни параметри. От друга гледна точка, ако трябва да получите тримесечни данни за цялата година в един курсор, може да е по-ефективно да преброите всички тримесечия и да ги сравните в една заявка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте псевдоним на колона в същия избор

  2. Не може да се зареди файл или сборка за Oracle.DataAccess в .NET

  3. Как да чета CLOB колона в Oracle с помощта на OleDb?

  4. Как да покажа изхода на sys_refcursor pl sql с инструмента Toad

  5. Oracle FETCH FIRST 1 ROW с оператор UNION ALL