यदि कम से कम 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
);
मेरे दृष्टिकोण से फ़ंक्शन/कर्सर पैरामीटर बहुत सामान्य है, एक रैपर बनाने के लिए बेहतर हो सकता है जो इनपुट पैरामीटर तिमाही संख्या और तुलना करने के लिए दो साल लेता है।
और अंत में, यदि परिणाम पीएल/एसक्यूएल में उपयोग करने की योजना बनाते हैं (मुझे लगता है कि एक पंक्ति लौटने के कारण) कर्सर का बिल्कुल भी उपयोग न करें, केवल आउटपुट पैरामीटर के माध्यम से परिकलित मान लौटाएं। दूसरे दृष्टिकोण से यदि आपको एक कर्सर में पूरे वर्ष के लिए तिमाही डेटा प्राप्त करने की आवश्यकता है तो सभी तिमाहियों की गणना करना और एकल क्वेरी में इसकी तुलना करना अधिक कुशल हो सकता है।