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)