मेरे पास मेरे परीक्षण डेटाबेस में 250K पंक्तियों के साथ एक तालिका है। (उत्पादन में कुछ सौ मिलियन हैं, हम वहां एक ही मुद्दे का निरीक्षण कर सकते हैं।) तालिका में एक अद्वितीय सूचकांक के साथ nvarchar2 (50) स्ट्रिंग पहचानकर्ता, शून्य नहीं है (यह पीके नहीं है)।
पहचानकर्ता पहले भाग से बने होते हैं, जिसमें मेरे परीक्षण डेटाबेस में 8 अलग-अलग मान होते हैं (और उत्पादन में लगभग एक हजार), फिर एक @ चिह्न, और अंत में एक संख्या, 1 से 6 अंक लंबा होता है। उदाहरण के लिए 50 हजार पंक्तियाँ हो सकती हैं जो 'ABCD_BGX1741F_2006_13_20110808.xml @' से शुरू होती हैं, और इसके बाद 50 हजार अलग-अलग संख्याएँ होती हैं।
जब मैं इसकी पहचानकर्ता के आधार पर एक पंक्ति के लिए क्वेरी करता हूं, तो कार्डिनिटी का अनुमान 1 है, लागत बहुत कम है, यह ठीक काम करता है। जब मैं IN या अभिव्यक्ति में कई पहचानकर्ताओं के साथ एक से अधिक पंक्ति के लिए क्वेरी करता हूं, तो सूचकांक के लिए अनुमान पूरी तरह से गलत हैं, इसलिए एक पूर्ण तालिका स्कैन का उपयोग किया जाता है। यदि मैं एक संकेत के साथ सूचकांक को मजबूर करता हूं, तो यह बहुत तेज है, पूर्ण तालिका स्कैन वास्तव में परिमाण धीमी (और उत्पादन में बहुत अधिक धीमी) के एक आदेश को निष्पादित किया जाता है। तो यह एक आशावादी समस्या है।
परीक्षण के रूप में, मैंने उसी डीडीएल और ठीक उसी सामग्री के साथ तालिका (एक ही स्कीमा + टेबलस्पेस में) की नकल की। मैंने अच्छे माप के लिए पहली तालिका में अद्वितीय सूचकांक को फिर से बनाया, और क्लोन तालिका पर सटीक एक ही सूचकांक बनाया। मैंने ए DBMS_STATS.GATHER_SCHEMA_STATS('schemaname',estimate_percent=>100,cascade=>true);
। आप यह भी देख सकते हैं कि सूचकांक के नाम लगातार हैं। तो अब दोनों तालिकाओं के बीच एकमात्र अंतर यह है कि पहले एक लंबे समय की अवधि में यादृच्छिक क्रम में लोड किया गया था, डिस्क पर बिखरे हुए ब्लॉकों के साथ (एक टेबलस्पेस में कई अन्य बड़ी तालिकाओं के साथ), दूसरे को एक बैच के रूप में लोड किया गया था सम्मिलित करें-का चयन करें। इसके अलावा, मैं किसी भी अंतर की कल्पना नहीं कर सकता। (मूल तालिका पिछले बड़ी विलोपन के बाद से सिकुड़ गई है, और उसके बाद एक भी डिलीट नहीं हुई है।)
यहां बीमारों और क्लोन तालिका के लिए क्वेरी योजनाएं हैं (काले ब्रश के नीचे के तार तस्वीर पर सभी समान हैं, और वे ग्रे ब्रश के नीचे भी हैं।)
(इस उदाहरण में, 1867 पंक्तियाँ हैं जो पहचानकर्ता के साथ शुरू होती हैं जो काला ब्रश है। 2-पंक्ति क्वेरी 1867 * 2 की कार्डिनैलिटी का उत्पादन करती है, एक 3-पंक्ति क्वेरी 1867 * 3 की कार्डिनैलिटी पैदा करती है, आदि। संयोग की बात है, ओरेकल को पहचानकर्ताओं के अंत की परवाह नहीं है।)
इस व्यवहार का क्या कारण हो सकता है? जाहिर है उत्पादन में तालिका को फिर से बनाना बहुत महंगा होगा।
USER_TABLES: http://i.stack.imgur.com/nDWze.jpg USER_INDEXES: http://i.stack.imgur.com/DG9um.jpg मैंने केवल स्कीमा और तालिकाओं का नाम बदल दिया है। आप देख सकते हैं कि टेबल और इंडेक्स नाम क्वेरी प्लान स्क्रीनशॉट पर समान हैं।