मैं Oracle में निम्नलिखित एसक्यूएल बयान को चलाने के लिए कोशिश कर रहा हूँ, और इसे चलाने के लिए उम्र लेता है:एक चयन करें क्वेरी जो SQL सर्वर पर जल्दी से चलाता है कि Oracle पर धीमी गति से चलाता है अनुकूलन
SELECT orderID FROM tasks WHERE orderID NOT IN
(SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL)
तो मैं बस चलाने उप-भाग में खंड, कि Oracle में बहुत जल्दी चलाता है कि, यानी
SELECT DISTINCT orderID FROM tasks WHERE
engineer1 IS NOT NULL AND engineer2 IS NOT NULL
क्यों पूरे बयान Oracle में इतने लंबे समय लेने के लिए है? SQL सर्वर में पूरा कथन जल्दी से चलता है।
वैकल्पिक रूप से एक सरल/अलग/बेहतर SQL कथन है जिसका उपयोग करना चाहिए?
समस्या के बारे में कुछ और जानकारी:
- प्रत्येक आदेश (engineer1 होगा और सेट engineer2 एक या अपने कार्य के अधिक) कई कार्यों
- प्रत्येक आदेश आवंटित किया जाएगा से बना है या आदेश कर सकते हैं अनियंत्रित किया जाना चाहिए (उसके सभी कार्यों में इंजीनियर फ़ील्ड के लिए शून्य मान हैं)
- मैं उन ऑर्डर आईडी को खोजने की कोशिश कर रहा हूं जो आवंटित नहीं हैं।
बस अगर कोई फर्क पड़ता है, तो तालिका में ~ 120k पंक्तियां, और क्रमशः 3 कार्य, इसलिए ~ 40k विभिन्न ऑर्डर होते हैं। उत्तर देने के लिए
जवाब:
- मैं एक एसक्यूएल बयान है कि दोनों एसक्यूएल सर्वर और Oracle में काम करता है पसंद करेंगे।
- कार्यों में केवल ऑर्डर आईडी और taskID पर एक अनुक्रमणिका है।
- मैंने कथन का EXISTS संस्करण नहीं करने की कोशिश की लेकिन इसे रद्द करने से 3 मिनट से अधिक समय तक चला। शायद बयान के जॉइन संस्करण की आवश्यकता है?
- ऑर्डर आईडी कॉलम के साथ "ऑर्डर" तालिका भी है। लेकिन मैं मूल SQL कथन में शामिल नहीं करके प्रश्न को सरल बनाने की कोशिश कर रहा था।
मुझे लगता है कि मूल SQL कथन में SQL क्वेरी के पहले भाग में प्रत्येक पंक्ति के लिए उप-क्वेरी हर बार चलती है - भले ही यह स्थिर है और केवल एक बार चलाने की आवश्यकता होनी चाहिए?
निष्पादित
ANALYZE TABLE tasks COMPUTE STATISTICS;
अपने मूल SQL विवरण बहुत तेजी से अमल कर दिया।
हालांकि मैं अभी भी उत्सुक हूं कि मुझे ऐसा क्यों करना है, और यदि मुझे इसे फिर से चलाने की आवश्यकता होगी?
आँकड़े Oracle की लागत आधारित optimzer जानकारी है कि यह दक्षता विभिन्न निष्पादन योजनाओं के निर्धारित करने की जरूरत दे: उदाहरण के लिए, एक मेज, पंक्तियों की औसत चौड़ाई rowsin की संख्या, उच्चतम और प्रति स्तंभ न्यूनतम मूल्य, प्रति कॉलम के अलग-अलग मान, क्लस्टरिंग इंडेक्स आदि का कारक आदि।
एक छोटे से डेटाबेस तुम सिर्फ सेटअप एक नौकरी हर रात आंकड़े एकत्र करता है और यह अकेला छोड़ने के लिए कर सकते हैं। वास्तव में, यह डिफ़ॉल्ट 10g के तहत है। बड़े कार्यान्वयन के लिए आपको आमतौर पर निष्पादन की स्थिरता का वजन होता है जिस तरह से डेटा परिवर्तन, जो एक मुश्किल संतुलन है, के खिलाफ योजनाओं का वजन करता है।
ओरेकल भी एक सुविधा "गतिशील नमूना" है कि निष्पादन समय पर प्रासंगिक आँकड़े निर्धारित करने के लिए नमूना तालिकाओं के लिए प्रयोग किया जाता है कहा जाता है। यह डेटा गोदामों के साथ अक्सर उपयोग किया जाता है जहां के ओवरहेड लंबे समय से चलने वाली क्वेरी के लिए संभावित प्रदर्शन वृद्धि से अधिक हो जाते हैं।
मैं कभी नहीं समझूंगा कि क्यों प्रोग्रामर अक्सर अपने इन क्लॉज में DISTINCT डालते हैं। 7 में (1, 1, 1, 1, 2, 2, 2, 7) है? 5 है अगर मेरी सूची (1, 2, 7) है तो उत्तर नहीं बदलता है। जब मैं ओरेकल में इसे चलाता हूं तो यह अलग-अलग अनदेखा करता है ... सीबीओ को पता चलता है कि कोई मूल्य नहीं है। –