PostgreSQL प्रक्रियात्मक भाषा - PL / pgSQL और SQL के बीच अंतर


20

क्या कोई इसके बीच के अंतर को संक्षेप में बता सकता है:

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

तथा

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

मुख्य केन्द्र:

  • वैचारिक मतभेद
  • एक समस्या परिवार, उपयोग की सुविधा
  • राजनैतिक मुद्दे

1
सबसे पहले, SQL (उर्फ क्वेरी भाषा) कार्यों में PostgreSQL प्रक्रियात्मक भाषाओं में से कोई भी शामिल नहीं है। दूसरे, आपने पहले से ही सबसे अच्छा स्रोत ढूंढ लिया है, जहां कोई भी आपके सवालों के जवाब पा सकता है (पिछले एक के अपवाद के साथ - 'राजनीतिक मुद्दों' से आप वास्तव में क्या करते हैं?)
dezso

मैंने सभी मुख्य मुद्दों को संक्षेप में प्रस्तुत करने के लिए कहा , जरूरी नहीं कि जो दस्तावेज़ मैंने चिपकाए, बल्कि व्यक्तिगत छापों का भी उपयोग कर रहा हो। वे लिंक वहाँ हैं बस यकीन है कि हर कोई समझता है कि सवाल क्या है।
जिस्मो रानास

इसे एक हमले के रूप में न लें, लेकिन एक बार जब आप पढ़ लेते हैं, तो आप इसे स्वयं सारांशित कर सकते हैं :) अन्यथा, आपका प्रश्न थोड़ा व्यापक है, लेकिन थोड़ा समय देकर मैं कुछ विचार एकत्र करने की कोशिश करूंगा।
dezso

1
अन्य प्रक्रियात्मक भाषाओं की उपेक्षा न करें। विशेष रूप से PL / Perl उन क्षेत्रों के लिए अत्यंत उपयोगी है जहाँ PL / PgSQL बहुत सीमित है; यदि आप पाइथन पसंद करते हैं तो PL / Pythonu काम करता है, लेकिन PL / Perl जैसे सुरक्षा मॉडल की पेशकश नहीं करता है। एड-ऑन के रूप में पीएल / वी 8 (जावास्क्रिप्ट) भी है।
क्रेग रिंगर

1
हाय कट्टो - मैं आपको साइट पर स्वागत करना चाहूंगा क्योंकि यह आपका पहला सवाल है। पोस्ट करने के लिए धन्यवाद और मुझे आशा है कि आप चारों ओर चिपकेंगे।
जैक डगलस

जवाबों:


27

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 बहुत अधिक अभिव्यंजक और शक्तिशाली है। मैं विचारों और सादे एसक्यूएल कार्यों का उपयोग अब और अधिक करता हूं। यह याद रखने योग्य है कि सादे एसक्यूएल फ़ंक्शन में एक से अधिक कथन हो सकते हैं; अंतिम कथन फ़ंक्शन का परिणाम है।


बहुत सही कहा! (अतिरिक्त
CTEs का

यह उत्तर यह भी बताता है कि कुछ कार्यों को अनुकूलन बाड़ की आवश्यकता क्यों है ।
Eonil

8

plpgsqlएक पूर्ण प्रक्रियात्मक भाषा है, जिसमें चर, लूपिंग निर्माण आदि शामिल हैं। एक SQLफ़ंक्शन केवल एक उपश्रेणी है। एक SQL फ़ंक्शन, यदि यह घोषित किया गया है STABLEया IMMUTABLEनहीं भी घोषित किया गया है STRICT, तो अक्सर कॉलिंग क्वेरी में इनबिल्ट किया जा सकता है , जैसे कि यह प्रत्येक संदर्भ में लिखा गया हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.