Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle Group-by Bug . पर एक नज़र

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 के हर इंस्टॉलेशन को प्रभावित नहीं कर सकता है, लेकिन यह जानने योग्य है कि क्या प्रश्नों के द्वारा चयनित समूह में गलत परिणाम दिखाई देने लगते हैं।

# # #

डेविड फिट्ज़जारेल . के लेख देखें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. खजूर के लिए हाइबरनेट मानदंड

  2. उदाहरण के साथ Oracle में हैश शामिल हों

  3. मैं तालिका से सभी कॉलम, साथ ही ROWNUM जैसे अतिरिक्त कॉलम कैसे चुनूं?

  4. Oracle का उपयोग करके INTO का चयन करें

  5. टेबल फंक्शन और पाइपलाइन फंक्शन के बीच अंतर?