मैं एक Oracle 10.2.0.3 डेटाबेस है के लिए गलत प्रमुखता का अनुमान है, और इस तरह एक प्रश्न:ओरेकल योजना की व्याख्या एक सूचकांक रेंज स्कैन
select count(a.id)
from LARGE_PARTITIONED_TABLE a
join SMALL_NONPARTITIONED_TABLE b on a.key1 = b.key1 and a.key2 = b.key2
where b.id = 1000
टेबल LARGE_PARTITIONED_TABLE (क) के बारे में 5 लाख पंक्तियां हैं, और विभाजित है एक कॉलम द्वारा क्वेरी में मौजूद नहीं है। तालिका SMALL_NONPARTITIONED_TABLE (बी) विभाजित नहीं है, और इसमें लगभग 10000 पंक्तियां हैं।
सांख्यिकी अद्यतित हैं, और स्तंभ कुंजी 1 में ऊंचाई संतुलित हिस्टोग्राम और तालिका ए की कुंजी 2 हैं।
तालिका ए में कॉलम की 1, की 2, की 3, की 4, और की 5 पर एक प्राथमिक कुंजी और गैर-विभाजित अद्वितीय अनुक्रमणिका है।
के बारे में बताएं क्वेरी के लिए योजना प्रदर्शित करता है निम्न परिणाम:
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 31 | 4 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 31 | | |
| 2 | NESTED LOOPS | | 406 | 12586 | 4 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN| INDEX_ON_TABLE_B | 1 | 19 | 2 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN| PRIMARY_KEY_INDEX_OF_TABLE_A | 406 | 4872 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("b"."id"=1000)
4 - access("a"."key1"="b"."key1" and
"a"."key2"="b"."key2")
इस प्रकार पंक्तियों (प्रमुखता) चरण 4 के लिए अनुमानित है।
Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=51 pr=9 pw=0 time=74674 us)
7366 NESTED LOOPS (cr=51 pr=9 pw=0 time=824941 us)
1 INDEX RANGE SCAN INDEX_ON_TABLE_B (cr=2 pr=0 pw=0 time=36 us)(object id 111111)
7366 INDEX RANGE SCAN PRIMARY_KEY_INDEX_OF_TABLE_A (cr=49 pr=9 pw=0 time=810173 us)(object id 222222)
तो वास्तविकता में प्रमुखता , नहीं 406 था:
अब, एक tkprof ट्रेस निम्नलिखित का पता चलता है! जहां ओरेकल इस मामले में अनुमान लगाया गया प्रमुखता 406 की प्राप्त करता है से , और मैं इसकी शुद्धता कैसे सुधार सकते हैं ताकि अनुमान क्या वास्तव में क्वेरी निष्पादन के दौरान होता है की पंक्ति में अधिक है:
मेरा प्रश्न यह है ?
अद्यतन: यहाँ एक 10053 ट्रेस मैं क्वेरी पर चलता था का एक टुकड़ा है।
NL Join
Outer table: Card: 1.00 Cost: 2.00 Resp: 2.00 Degree: 1 Bytes: 19
Inner table: LARGE_PARTITIONED_TABLE Alias: a
...
Access Path: index (IndexOnly)
Index: PRIMARY_KEY_INDEX_OF_TABLE_A
resc_io: 2.00 resc_cpu: 27093
ix_sel: 1.3263e-005 ix_sel_with_filters: 1.3263e-005
NL Join (ordered): Cost: 4.00 Resp: 4.00 Degree: 1
Cost_io: 4.00 Cost_cpu: 41536
Resp_io: 4.00 Resp_cpu: 41536
****** trying bitmap/domain indexes ******
Best NL cost: 4.00
resc: 4.00 resc_io: 4.00 resc_cpu: 41536
resp: 4.00 resp_io: 4.00 resp_cpu: 41536
Using concatenated index cardinality for table SMALL_NONPARTITIONED_TABLE
Revised join sel: 8.2891-e005 = 8.4475e-005 * (1/12064.00) * (1/8.4475e-005)
Join Card: 405.95 = outer (1.00) * inner (4897354.00) * sel (8.2891-e005)
Join Card - Rounded: 406 Computed: 405.95
तो वह स्थान जहां से 406 मूल्य आ रहा है। एडम की तरह उत्तर दिया, कार्डिनिटी में शामिल होने join selectivity * filter cardinality (a) * filter cardinality (b)
है, जैसा कि उपरोक्त ट्रेस उद्धरण की दूसरी पंक्ति में देखा जा सकता है।
जो मुझे समझ में नहीं आता Revised join sel
लाइन है। 1/12064 तालिका बी (तालिका पर 12064 पंक्तियों, और अद्वितीय आईडी के आधार पर चयन) से पंक्ति खोजने के लिए प्रयुक्त सूचकांक की चयनशीलता है। लेकिन तो क्या?
प्रमुखता तालिका के चयनात्मकता एक (1/12064) के साथ फिल्टर तालिका ख (4,897,354) की प्रमुखता गुणा द्वारा गणना प्रतीत होता है। क्यों? क्या पर तालिका एक चयनात्मकता कितना पंक्तियों से तालिका ख पाया होने की उम्मीद है के साथ क्या करना है करता है, जब एक -> ख में शामिल होने a.id पर आधारित नहीं है?
संख्या 8 कहां है।4475e-005 से आते हैं (यह पूरे ट्रेस में कहीं और नहीं दिखाई देता है)? ऐसा नहीं है कि यह आउटपुट को प्रभावित करता है, लेकिन मैं अभी भी जानना चाहता हूं।
मैं समझता हूं कि अनुकूलक ने यहां सही पथ चुना है। लेकिन अभी भी कार्डिनालिटी का अनुमान है - और उस बिंदु से चुने गए निष्पादन पथ पर इसका एक बड़ा प्रभाव हो सकता है (जैसा कि मेरे पास आईआरएल है - यह उदाहरण उस का सरलीकरण है)।
धन्यवाद एडम। मैं निश्चित रूप से क्वेरी के 10053 ट्रेस पर एक नज़र डालेंगे। कल मेरे परिणाम पोस्ट करेंगे। – Tommi
मैंने अब 10053 ट्रेस के साथ प्रश्न अपडेट किया है, कृपया ऊपर देखें। – Tommi
मैं दूसरे प्रश्न का उत्तर नहीं दे सकता - ओरेकल के बहुत सारे फज कारक हैं, और समेकित सूचकांक कार्डिनिटी नियम अच्छी तरह से प्रलेखित नहीं हैं। इसके अलावा, यह एक कारक है जो खुद को रद्द कर देता है। एबी कार्डिनिटी में शामिल होने वाली बी (4897354) की पूर्ण कार्डिनालिटी द्वारा गुणा किए गए ए (1 पंक्ति) की सापेक्ष कार्डिनालिटी पर आधारित है जो कि चुनिंदाता से गुणा हो जाती है - जो ए की पूर्ण कार्डिनालिटी है इसे देखें मार्ग। आपकी तालिकाएं बी में बी से 48 9 7354 पंक्तियों में 12046 पंक्तियां हैं। इसलिए ए में प्रत्येक पंक्ति के लिए, औसतन 406 पंक्तियां बी –