Oracle डेटाबेस में LIMIT क्लॉज के साथ बल्क कलेक्ट
अब तक हमने सीखा है कि SELECT-INTO के साथ बल्क कलेक्ट का उपयोग करके क्वेरी प्रदर्शन में सुधार कैसे किया जाता है जो एक स्पष्ट कर्सर के निहित कर्सर और FETCH-INTO स्टेटमेंट का उपयोग करता है। लेकिन सवाल यह है कि क्या अभी भी आगे की क्वेरी ऑप्टिमाइज़ेशन की गुंजाइश है? इस ब्लॉग में, हम सीखेंगे कि हम बल्क कलेक्ट के साथ लिमिट क्लॉज का उपयोग करके अपनी क्वेरी को और कैसे बेहतर बना सकते हैं?
हमने पहले ही सेलेक्ट-इन के साथ बल्क कलेक्ट का उपयोग करके कई स्विच को कंप्रेस करने की प्रक्रिया सीख ली है और बदले में एक स्पष्ट कर्सर के फ़ेच-इन स्टेटमेंट के साथ इसका उपयोग करके क्वेरी पर अधिक नियंत्रण प्राप्त करते हैं। लेकिन अभी भी एक समस्या है जिस पर हमें ध्यान देने की आवश्यकता है और वह है थोक संग्रह के कारण अत्यधिक स्मृति थकावट।
थोक संग्रह के कारण अत्यधिक स्मृति थकावट से आपका क्या तात्पर्य है?
जब भी हम बल्क कलेक्ट क्लॉज का उपयोग करके बड़ी संख्या में रिकॉर्ड प्राप्त करते हैं या प्राप्त करते हैं, तो हमारा प्रोग्राम तेज और कुशल होने के लिए बहुत अधिक मेमोरी का उपभोग करना शुरू कर देता है। यह केवल कोई स्मृति नहीं है। Oracle डेटाबेस के सभी सत्रों में साझा की जाने वाली SGA मेमोरी के विपरीत, प्रोग्राम PGA मेमोरी का उपभोग करता है जो विशेष रूप से प्रत्येक सत्र के लिए आवंटित की जाती है।
यह डेटाबेस के प्रदर्शन को ख़राब करता है। इसका मतलब है कि हमारी क्वेरी निश्चित रूप से अच्छा प्रदर्शन कर रही होगी, लेकिन साथ ही, हमारा डेटाबेस ऐसा नहीं भी कर सकता है।
हमारे संपूर्ण डेटाबेस के प्रदर्शन से समझौता करके हमारे पास एक अच्छी तरह से अनुकूलित क्वेरी नहीं हो सकती है। सही?
थोक संग्रह करके हम स्मृति थकावट की इस समस्या को कैसे हल कर सकते हैं?
स्मृति थकावट की इस समस्या को आसानी से दूर किया जा सकता है यदि हम थोक संग्रह का उपयोग करके प्राप्त किए गए डेटा की मात्रा को नियंत्रित और बाधित कर सकते हैं। हम LIMIT क्लॉज के साथ बल्क कलेक्ट का उपयोग करके ऐसा कर सकते हैं।
LIMIT क्लॉज का सिंटैक्स क्या है?
LIMIT क्लॉज FETCH-INTO स्टेटमेंट की विशेषता के रूप में काम करता है:
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection> LIMIT number;
चूंकि LIMIT FETCH-INTO स्टेटमेंट की एक विशेषता के रूप में काम करता है, इसलिए इसका उपयोग करने के लिए आप LIMIT कीवर्ड जोड़ सकते हैं, उसके बाद एक विशिष्ट संख्यात्मक अंक जो पंक्तियों की संख्या निर्दिष्ट करेगा जो कि FETCH के अंत में एक बार में बल्क-कलेक्ट क्लॉज को पुनः प्राप्त करेगा। -INTO स्टेटमेंट।
LIMIT क्लॉज क्या करता है?
LIMIT क्लॉज FETCH स्टेटमेंट के साथ BULK COLLECT का उपयोग करके प्राप्त की गई पंक्तियों की संख्या को प्रतिबंधित करता है।
क्या हम SELECT-INTO स्टेटमेंट के साथ LIMIT क्लॉज का इस्तेमाल कर सकते हैं?
नहीं, हम SELECT-INTO स्टेटमेंट के साथ LIMIT क्लॉज का उपयोग नहीं कर सकते हैं। LIMIT क्लॉज FETCH-INTO स्टेटमेंट के लिए एक विशेषता के रूप में काम करता है क्योंकि LIMIT क्लॉज को काम करने के लिए एक स्पष्ट कर्सर की आवश्यकता होती है और FETCH-INTO स्टेटमेंट स्पष्ट कर्सर जीवन चक्र का एक हिस्सा है।
इसलिए हमेशा याद रखें कि LIMIT क्लॉज का उपयोग केवल तभी किया जा सकता है जब आप FETCH-INTO स्टेटमेंट के साथ BULK COLLECT का उपयोग कर रहे हों। इसका उपयोग तब नहीं किया जा सकता जब आप SELECT-INTO स्टेटमेंट के साथ बल्क कलेक्ट का उपयोग कर रहे हों।
उदाहरण:Oracle डेटाबेस में बल्क कलेक्ट स्टेटमेंट के साथ LIMIT क्लॉज का उपयोग कैसे करें
यहां एक बहुत ही सरल उदाहरण दिया गया है जो आपको दिखा रहा है कि आप LIMIT क्लॉज के साथ कैसे काम कर सकते हैं।
SET SERVEROUTPUT ON; DECLARE CURSOR exp_cur IS SELECT first_name FROM employees; TYPE nt_fName IS TABLE OF VARCHAR2(20); fname nt_fName; BEGIN OPEN exp_cur; FETCH exp_cur BULK COLLECT INTO fname LIMIT 10; CLOSE exp_cur; --Print data FOR idx IN 1 .. fname.COUNT LOOP DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) ); END LOOP; END; /
उपरोक्त कोड की विस्तृत व्याख्या के लिए आप मेरे YouTube चैनल पर वीडियो ट्यूटोरियल देख सकते हैं।
इसलिए इस बार सभी रिकॉर्ड लाने और मेमोरी जैसे महंगे संसाधन को समाप्त करने के बजाय, LIMIT क्लॉज के लिए धन्यवाद, हम केवल आवश्यक पंक्तियों को पुनः प्राप्त कर रहे हैं और वह भी बिना किसी संसाधन की बर्बादी के। इस तरह हम थोक संग्रह के साथ अपने क्वेरी प्रदर्शन को एक पायदान ऊपर ले जा सकते हैं।
तो अब आप मनीष से पूछें कि हम कितनी पंक्तियाँ प्राप्त कर सकते हैं?
इस प्रश्न का उत्तर जानने के लिए मेरा सुझाव है कि आप मेरे प्रिय मित्र स्टीवन फ्यूरस्टीन के इस ब्लॉग को Oracle की वेबसाइट पर पढ़ें। उन्होंने इस प्रश्न का उत्तर बहुत अच्छे से दिया है।
इस दृष्टिकोण के साथ एक कमी भी है और वह है:यदि आप इसी प्रोग्राम को फिर से निष्पादित करते हैं, तो LIMIT क्लॉज वाला यह FETCH-INTO स्टेटमेंट अगले 10 रिकॉर्ड के साथ संग्रह को नहीं जोड़ेगा। इसके बजाय, यह तालिका को छोटा कर देगा और नेस्टेड तालिका को अनुक्रमणिका संख्या 1 से फिर से पॉप्युलेट करेगा।
मेरे प्रिय मित्र कॉनर मैकडॉनल्ड्स ने एक ब्लॉग किया है जिसमें बताया गया है कि आप MULTISET का उपयोग करके इस समस्या को कैसे दूर कर सकते हैं। आगे बढ़ें और उसका लेख देखें।
ओरेकल डेटाबेस में बल्क कलेक्ट के साथ LIMIT क्लॉज का उपयोग कैसे करें, इस पर विस्तृत PL/SQL ब्लॉग है। आशा है कि आपको पढ़ने में मज़ा आया होगा, यदि ऐसा है तो इस ट्यूटोरियल को अपने दोस्तों के साथ अपने सोशल मीडिया पर साझा करना सुनिश्चित करें। पढ़ने के लिए धन्यवाद। आपका दिन शुभ हो!