Oracle ने एक नई सुविधा शुरू की, समूह द्वारा उन्मूलन, उन प्रश्नों के लिए जहां स्तंभ द्वारा समूह तालिका की अनूठी कुंजी भी है। जैसा कि कई नई सुविधाओं के साथ होता है, यह अभी भी सभी किंकों को हल नहीं कर पाया है। समस्या तब उत्पन्न होती है जब फ़ंक्शन कॉल के साथ प्रमुख मानों में हेरफेर किया जाता है। निम्न उदाहरण प्राथमिक कुंजी के रूप में DATE वाली तालिका का उपयोग करके और TO_CHAR या EXTRACT का उपयोग करके वर्ष निकालने के द्वारा समस्या का वर्णन करेगा।
एक तालिका इस प्रकार बनाई जाती है:
create table bug_test_calendar(
cal_name char(17),
bus_dt date,
updt_timestamp timestamp (6) default systimestamp,
constraint pk_bug_test_calendar
primary key (bus_dt)
)
/
insert into bug_test_calendar (bus_dt)
select
sysdate + 10 * rownum
from
all_objects
where
rownum <= 40
/
commit;
जब नीचे दिखाया गया प्रश्न निष्पादित होता है, तो यह निम्नलिखित परिणाम देता है:
select
to_char(bus_dt,'YYYY') bus_dt, count(*) ct
from
bug_test_calendar
group by
to_char(bus_dt,'YYYY')
order by
to_char(bus_dt,'YYYY')
/
BUS_DF CT
------- --
2020 1
2020 1
...
2020 1
40 rows returned
Oracle 'जानता' नहीं है कि प्रमुख मानों में हेरफेर किया गया है ताकि वे अब अद्वितीय न हों, इस प्रकार अनुकूलक अद्वितीय-कुंजी-आधारित समूह-उन्मूलन को कम से कम तारकीय परिणामों के साथ लागू करता है,
EXTRACT किराया बेहतर नहीं है, वही परिणाम लौटाता है। यह व्यवहार "_optimizer_aggr_groupby_elim" पैरामीटर द्वारा नियंत्रित होता है, जो डिफ़ॉल्ट रूप से सही पर सेट होता है। चूंकि यह एक छिपा हुआ पैरामीटर है, इसकी सेटिंग Oracle द्वारा V$PARAMEter या V$SPPARAMETER दृश्यों में से किसी में भी रिपोर्ट नहीं की गई है। वर्कअराउंड बस इस पैरामीटर को गलत पर सेट करना है। हालांकि, इसे सक्रिय रखने से अन्य समूह-दर-प्रश्नों में मदद मिल सकती है जहां अद्वितीय कुंजी मानों में हेरफेर नहीं किया जाता है।
Oracle 19c दर्ज करें, जहां यह कार्यक्षमता आंशिक रूप से तय की गई है:
select
to_char(bus_dt,'YYYY') bus_dt, count(*) ct
from
bug_test_calendar
group by
to_char(bus_dt,'YYYY')
order by
to_char(bus_dt,'YYYY')
/
BUS_DF CT
------- --
2020 40
दुर्भाग्य से EXTRACT अभी भी 19c में टूटा हुआ है:
select
to_char(bus_dt,'YYYY') bus_dt, count(*) ct
from
bug_test_calendar
group by
extract(year deom bus_dt)
order by
extract(year deom bus_dt)
/
BUS_DF CT
------- ==
2020 1
2020 1
...
2020 1
40 rows returned
स्पष्ट रूप से वास्तव में अद्वितीय कुंजी मान दिए गए हैं, एक समूह-दर क्वेरी प्रत्येक कुंजी के लिए 1 की गिनती उत्पन्न करेगी। और, जैसा कि स्पष्ट है, ओरेकल को यह पहचानने में सक्षम होना चाहिए कि मूल्य अब अद्वितीय नहीं हैं और उचित समूह-दर तंत्र को लागू करते हैं। यह देखा जाना बाकी है कि क्या 19c के बाद के संस्करण दूसरी स्थिति को ठीक कर देंगे और इस प्रकार इस सुविधा को बंद किए बिना सही परिणाम देंगे।
यह 12.1 से नए Oracle के हर इंस्टॉलेशन को प्रभावित नहीं कर सकता है, लेकिन यह जानने योग्य है कि क्या प्रश्नों के द्वारा चयनित समूह में गलत परिणाम दिखाई देने लगते हैं।
# # #
डेविड फिट्ज़जारेल . के लेख देखें