2009-09-23 11 views
10

क्या ऑरैक विश्लेषणात्मक कार्यों का उपयोग करते समय किसी को भी धीमी कार्यक्षमता का सामना करना पड़ा है? लीड() ऑरैकल विश्लेषणात्मक फ़ंक्शन का उपयोग तालिका में एक नया फ़ील्ड उत्पन्न करने के लिए किया गया था। असल में, यह पिछली पंक्ति के फ़ील्ड मान को वर्तमान पंक्ति के नए फ़ील्ड के मान के रूप में उपयोग करने की अनुमति देगा। समझाया गया योजना इंगित करता है कि टेबल पर एक पूर्ण टेबल स्कैन किया जाता है जिस पर ऑरैक विश्लेषणात्मक फ़ंक्शन का उपयोग किया जाता था।ओरेकल विश्लेषणात्मक कार्य महंगा हैं?

इस पूर्ण तालिका स्कैन की लागत से बचने के लिए, मैं सिर्फ मैन्युअल रूप से पिछली पंक्ति के मूल्य सम्मिलित/अपडेट ट्रिगर के बाद एक का उपयोग कर

किसी को भी एक दैवज्ञ विश्लेषणात्मक कार्य का उपयोग नहीं करने का फैसला किया है के साथ एक ठोस क्षेत्र को भरने के लिए हो सकता है इसकी उच्च लागत के कारण? क्या ऑरैक विश्लेषणात्मक कार्यों का शायद ही कभी उपयोग किया जाना चाहिए?

+0

आप हमें अपना कोड क्यों नहीं दिखाते? इसके बिना अच्छी सलाह देना बहुत मुश्किल है। मुझे समझ में नहीं आता है कि विश्लेषणात्मक कार्य को पूर्ण टेबल स्कैन क्यों करना है? क्या आप आईडी पर पहले से क्लॉज के साथ फ़िल्टर नहीं कर सकते? – tuinstoel

उत्तर

2

यह इस बात पर निर्भर करता है कि आपकी तालिका को अनुक्रमित किया गया है और आप किस कार्य का उपयोग करते हैं।

ROW_NUMBER(), उदाहरण के लिए, ROWNUM से कम कुशल प्रतीत होता है, भले ही अनुक्रमणिका का उपयोग किया जाता है। प्रदर्शन की तुलना के लिए अपने ब्लॉग में इस लेख देखें:

Oracle के अनुकूलक खिड़की कार्यों के बारे में जानता है और STOPKEY और PUSHED RANK जैसे कई चालें का उपयोग कर सकते है जो उन्हें और अधिक कुशल बनाने।

समझाया गया योजना इंगित करती है कि टेबल पर एक पूर्ण टेबल स्कैन किया जाता है जिस पर ऑरैक विश्लेषणात्मक कार्य का उपयोग किया जाता था।

तालिका स्कैन स्वयं खराब नहीं है। यह वास्तव में इष्टतम हो सकता है, अगर सूचकांक में अनुपलब्ध मानों को पुनर्प्राप्त करने के लिए TABLE ACCESS फ़िल्टरिंग और सॉर्टिंग से अधिक महंगा है।

आमतौर पर, यदि आपकी तालिका अनुक्रमित की गई है, क्वेरी WHERE और ORDER BY खंड आदेश देने के लिए इस सूचकांक के उपयोग की अनुमति और अनुकूलक समझता है का उपयोग कर के लायक यह सूचकांक, WINDOW BUFFER विधि LAG और LEAD कार्यों के लिए प्रयोग किया जाता है।

इंजन 2 पंक्तियों (या अधिक, ऑफसेट के मूल्य के आधार पर) के चलते बफर को रखता है और मूल्यों को पहली और दूसरी पंक्ति से देता है।

हालांकि, अनुकूलक इंडेक्स को बिल्कुल भी उपयोग करने योग्य नहीं मान सकता है।

इस मामले में, यह WINDOW SORT का उपयोग करेगा: वही बात है लेकिन सॉर्टिंग स्मृति या अस्थायी टेबलस्पेस में किया जाता है।

6

विश्लेषणात्मक फ़ंक्शंस बिना लागत के हैं: उन्हें मध्यवर्ती परिणामों (कुल योग, चलने वाले कार्यों ...) के लिए डेटा स्टोर करना होगा, जिन्हें स्मृति की आवश्यकता होती है और वे कुछ प्रोसेसिंग पावर भी लेते हैं। परिणाम को वापस करने में सक्षम होने के लिए कुछ फ़ंक्शंस परिणाम परिणाम की अंतिम पंक्ति तक पहुंचने की आवश्यकता होगी (उदाहरण के लिए MIN/MAX)। अधिकांश कार्यों में एक अंतर्निहित एसओआरटी ऑपरेशन भी होगा।

इसलिए वे संसाधनों के मामले में स्वतंत्र नहीं हैं लेकिन वे एसईटी संचालन हैं और अधिकांश समय वे कस्टम पंक्ति-दर-पंक्ति plsql प्रक्रिया या पारंपरिक एसक्यूएल लिखने से कहीं अधिक कुशल हैं।

आपको अपने विशिष्ट मामले में तुलना और बेंचमार्क करना होगा, लेकिन यदि आप उन्हें बुद्धिमानी से उपयोग करते हैं, तो आप देखेंगे कि वे एक शक्तिशाली प्रदर्शन उपकरण हैं, बाधा नहीं।

3

इस पर कुछ विवरण जोनाथन लुईस के ब्लॉग here पर उपलब्ध है।

वास्तव में सवाल होना चाहिए, क्या वे विकल्प से कम या कम महंगे हैं, और यह विशेष स्थिति में आ जाएगा। कुछ मामलों में आप डेटा को ऐप सर्वर पर खींचना पसंद कर सकते हैं और इसे वहां संसाधित कर सकते हैं क्योंकि यह उस स्तर पर अतिरिक्त हार्डवेयर रखने के लिए आमतौर पर सस्ता/आसान होता है।

लेकिन एसक्यूएल में इसे करने और पीएल/एसक्यूएल प्रोसेसिंग जोड़ने के बीच एक विकल्प दिया गया, तो मैं आम तौर पर एसक्यूएल का उपयोग करता।

1

बेशक, उनके पास लागत है और आपको यह तय करना होगा कि आप इसका भुगतान कर सकते हैं या नहीं।

मेरे मामले में, मैंने एक संग्रहित प्रक्रिया बनाई है जो एक तालिका को पुन: सक्रिय करता है और ओरेकल लीड() फ़ंक्शन का उपयोग करके कुछ तिथियों की गणना करता है और परिणामों को किसी अन्य तालिका में संग्रहीत करता है। अंत में, मैं अपने ऐप में इस बाद की तालिका का उपयोग करता हूं और सप्ताह में एक बार पहली तालिका (संग्रहित प्रक्रिया चला रहा हूं) अपडेट करता हूं क्योंकि वह डेटा अक्सर नहीं बदलता है।

मेरे लिए, यह सबसे अच्छा समाधान था।

संबंधित मुद्दे