Có vẻ là một biến thể tốt trong trường hợp có chỉ mục trên ít nhất effective_start_date
và effective_end_date
các trường của per_all_people_f
bảng.
Biến thể lý tưởng cho truy vấn này là
create index x_per_all_people_search on per_all_people_f(
effective_start_date,
effective_end_date,
person_id,
emp_flag
)
nhưng nó có thể quá đắt để duy trì (chi phí đĩa, tốc độ chèn).
Ngoài ra, con trỏ trong phần thân gói phải chứa truy vấn con và sử dụng lại kết quả cuộc gọi hàm:
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
);
Tất nhiên giải pháp tốt nhất là giảm thiểu chuyển đổi ngữ cảnh và lấy tất cả các giá trị từ một truy vấn SQL. Ngoài ra, bạn có thể cung cấp các tham số trực tiếp cho con trỏ:
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
);
Theo quan điểm của tôi, các tham số hàm / con trỏ quá chung chung, tốt hơn nên tạo một trình bao bọc lấy tham số đầu vào là số quý và hai năm để so sánh.
Và cuối cùng, nếu kết quả được lên kế hoạch sử dụng trong PL / SQL (tôi cho rằng vì trả về một hàng duy nhất) hoàn toàn không sử dụng con trỏ, chỉ trả về các giá trị được tính toán thông qua các tham số đầu ra. Từ một quan điểm khác, nếu bạn cần lấy dữ liệu quý cho cả năm trong một con trỏ, có thể hiệu quả hơn khi đếm tất cả các quý và so sánh nó trong một truy vấn duy nhất.