PL / PgSQL और प्लेन SQL फंक्शन दोनों एक बड़े टूल सेट का हिस्सा हैं, और इसे इस संदर्भ में देखा जाना चाहिए। मैं आरोही जटिलता और लागत से मेल खाते हुए शक्ति के बढ़ते पैमाने के संदर्भ में इसके बारे में सोचता हूं, जहां आपको सबसे सरल उपकरण का उपयोग करना चाहिए जो काम को अच्छी तरह से करेगा:
- जहां संभव हो, विचारों का उपयोग करें
- जहाँ कोई दृश्य उपयुक्त नहीं है, SQL फ़ंक्शन का उपयोग करें
- जहाँ SQL फ़ंक्शन उपयुक्त नहीं है, PL / PgSQL का उपयोग करें।
- जहाँ PL / PgSQL बहुत सीमित है या पर्याप्त अभिव्यंजक नहीं है, PL / Perl, PL / Python, PL / V8, PL / Java, या जो कुछ भी आपकी पसंद है, का उपयोग करें
- ... और जहां कोई पीएल काम नहीं करेगा, एक बाहरी कार्यक्रम का उपयोग करें और संभवतः
LISTENऔर NOTIFYउससे बात करने के लिए।
बहुत बार एक दृश्य पर्याप्त होता है जब आपको लगता है कि फ़ंक्शन की आवश्यकता है। यहां तक कि अगर यह SELECTपूरे दृश्य के लिए बहुत महंगा है , WHEREतो क्वेरी का संदर्भ संदर्भित करने वाले दृश्य को आमतौर पर दृश्य में नीचे धकेल दिया जाता है और इसके परिणामस्वरूप बहुत भिन्न क्वेरी योजना हो सकती है। मैंने अक्सर एसक्यूएल कार्यों को विचारों में परिवर्तित करने से बड़ा प्रदर्शन सुधार किया है।
मुख्य समय जब आप पाते हैं कि आप एक दृश्य का उपयोग नहीं कर सकते हैं और यह विचार करना चाहिए कि SQL फ़ंक्शन कब है:
- ऐसे पैरामीटर जिन्हें सरल
WHEREखंड के रूप में व्यक्त नहीं किया जा सकता है , एक WITHअभिव्यक्ति के भीतर एक पैरामीटर की तरह
- आप एक
SECURITY DEFINERफ़ंक्शन के माध्यम से सुरक्षा अवरोध चाहते हैं , और security_barrierPostgreSQL 9.2 और इसके बाद के संस्करण आपकी आवश्यकताओं के लिए पर्याप्त नहीं हैं;
- आपको ऐसे मापदंडों की आवश्यकता होती है, जो ऑप्टिमाइज़र द्वारा किसी दृश्य के उप-खंडों में धकेल नहीं दिए जाते हैं और इसे और अधिक सीधे नियंत्रित करना चाहते हैं; या
- बहुत सारे परमेस हैं या वहाँ बहुत सारे पारमेट्स दोहराए जाते हैं, इसलिए क्वेरी को एक दृश्य के रूप में लिखना अव्यावहारिक है।
उन कार्यों के अधिकांश के लिए एक सादे SQL फ़ंक्शन ठीक काम करता है, और अक्सर PL / PgSQL की तुलना में पढ़ना आसान होता है। एसक्यूएल फ़ंक्शन घोषित STABLEया IMMUTABLE(और भी घोषित नहीं किए गए हैं STRICTया नहीं)SECURITY DEFINER ) कॉलिंग स्टेटमेंट में भी इनबिल्ट हो सकते हैं। जब फ़ंक्शन कॉल ओवरहेड से छुटकारा मिल जाता है और कभी-कभी भारी प्रदर्शन लाभ भी हो सकता है जब कॉल फ़ंक्शन में WHERE की स्थिति को ऑप्टिमाइज़र द्वारा SQL फ़ंक्शन में नीचे धकेल दिया जाता है। जब भी वे कार्य के लिए पर्याप्त हों, SQL कार्यों का उपयोग करें।
मुख्य कार्य SQL कार्य नहीं करेगा जब आपको बहुत सारे तर्क की आवश्यकता होती है। यदि आप / फिर / अन्यथा परिचालन जिसे आप CASEबयानों के रूप में व्यक्त नहीं कर सकते हैं , गणना परिणामों के पुन: उपयोग के बहुत सारे, चंक्स से मूल्यों का निर्माण, त्रुटि से निपटने आदि पीएल / पीजीसीएल तब काम में आता है। पीएल / पीजीसीएल चुनें जब आप एसक्यूएल कार्यों का उपयोग नहीं कर सकते हैं या वे एक खराब फिट हैं, जैसे:
EXECUTEबयान के माध्यम से गतिशील SQL और गतिशील DDL
- जब आप
RAISEलॉग या क्लाइंट के लिए त्रुटियाँ / चेतावनियाँ चाहते हैं
- जब आपको अपवाद हैंडलिंग की आवश्यकता होती है - तो आप
EXCEPTIONपूरे लेनदेन को त्रुटि पर समाप्त करने के बजाय ब्लॉक के साथ त्रुटियों को ट्रैप और संभाल सकते हैं
- जटिल सशर्त तर्क जो
CASE ... WHENबहुत अच्छी तरह से फिट नहीं है
- गणना किए गए मानों के पुन: उपयोग के बहुत सारे विकल्प जिन्हें आप
WITHऔर सीटीई में फिट नहीं कर सकते हैं
- गतिशील रिकॉर्ड का निर्माण
- आपको परिणाम सेट का उत्पादन करने के बाद कार्रवाई करने की आवश्यकता है
सामान्य तालिका अभिव्यक्तियों (CTE) के साथ, विशेष रूप से लेखन योग्य CTEs और WITH RECURSIVEमुझे लगता है कि मैं PL / PgSQL का उपयोग बहुत कम करता हूं, क्योंकि मैं SQL बहुत अधिक अभिव्यंजक और शक्तिशाली है। मैं विचारों और सादे एसक्यूएल कार्यों का उपयोग अब और अधिक करता हूं। यह याद रखने योग्य है कि सादे एसक्यूएल फ़ंक्शन में एक से अधिक कथन हो सकते हैं; अंतिम कथन फ़ंक्शन का परिणाम है।