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.