少なくとも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
);
私の見解では、関数/カーソルパラメータは一般的すぎるため、入力パラメータとして四半期数と比較に2年かかるラッパーを作成する方がよい場合があります。
最後に、PL / SQLで使用する予定の結果(単一行を返すためだと思います)がカーソルをまったく使用しない場合は、出力パラメータを介して計算値を返すだけです。別の観点から、1つのカーソルで通年の四半期データを取得する必要がある場合は、すべての四半期をカウントして1つのクエリで比較する方が効率的です。