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

Oracle SQL ऑप्टिमाइज़र इस दृश्य के लिए इंडेक्स विधेय को अनदेखा क्यों कर रहा है?

Oracle अनुक्रमणिका का उपयोग नहीं करता है क्योंकि यह मानता है कि select column_value from table(x) 8168 पंक्तियाँ लौटाता है।

छोटी मात्रा में डेटा प्राप्त करने के लिए अनुक्रमणिकाएँ तेज़ होती हैं। किसी बिंदु पर इंडेक्स ट्री पर बार-बार चलने की तुलना में पूरी तालिका को स्कैन करना तेज़ होता है।

एक नियमित SQL स्टेटमेंट की कार्डिनैलिटी का अनुमान लगाना काफी मुश्किल है। प्रक्रियात्मक कोड के लिए एक सटीक अनुमान बनाना लगभग असंभव है। लेकिन मुझे नहीं पता कि वे 8168 के साथ कहां आए। टेबल फ़ंक्शन आमतौर पर डेटा वेयरहाउस में पाइपलाइन किए गए कार्यों के साथ उपयोग किए जाते हैं, एक बड़ी संख्या में समझ में आता है।

डायनामिक सैंपलिंग एक अधिक सटीक अनुमान उत्पन्न कर सकता है और संभावित रूप से एक योजना तैयार कर सकता है जो सूचकांक का उपयोग करेगा।

यहां एक खराब कार्डिनैलिटी अनुमान का उदाहरण दिया गया है:

create or replace type type_table_of_number as table of number;

explain plan for
select * from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));

Plan hash value: 1748000095

-------------------------------------------------------------------------
| Id  | Operation                             | Name | Rows  | Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |      |  8168 | 00:00:01 |
|   1 |  COLLECTION ITERATOR CONSTRUCTOR FETCH|      |  8168 | 00:00:01 |
-------------------------------------------------------------------------

इसे ठीक करने का तरीका यहां दिया गया है:

explain plan for select /*+ dynamic_sampling(2) */ *
                 from table(type_table_of_number(1,2,3,4,5,6,7));
select * from table(dbms_xplan.display(format => '-cost -bytes'));

Plan hash value: 1748000095

-------------------------------------------------------------------------
| Id  | Operation                             | Name | Rows  | Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT                      |      |     7 | 00:00:01 |
|   1 |  COLLECTION ITERATOR CONSTRUCTOR FETCH|      |     7 | 00:00:01 |
-------------------------------------------------------------------------

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)



  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. ORA-01950:टेबलस्पेस 'USERS' पर कोई विशेषाधिकार नहीं

  3. Oracle SELECT - डबल कोट्स या कोई डबल कोट्स नहीं?

  4. पीएल/एसक्यूएल का उपयोग कर तालिका से डेटा पुनर्प्राप्त करना

  5. 'LIKE' ऑपरेटर का उपयोग एक सबक्वेरी के साथ करना जो कई परिणाम देता है