कड़ाई से बोलते हुए, शब्द "संग्रहीत कार्यविधियाँ" पोस्टग्रेज में एसक्यूएल प्रक्रियाओं को इंगित करता है , पोस्टग्रेज 11 के साथ पेश किया गया है। संबंधित:
वहाँ भी कार्य कर रहे हैं , लगभग नहीं बल्कि काफी समान हैं, और वे शुरू से ही रहे हैं।
कार्य के साथ LANGUAGE sql
मूल रूप से एक समारोह आवरण में सादे SQL कमांड (और इसलिए परमाणु, हमेशा एक अंदर चलाने के साथ सिर्फ बैच फ़ाइलें हैं एकल लेन-देन) को स्वीकार मानकों। एक एसक्यूएल फ़ंक्शन में सभी स्टेटमेंट एक बार में प्लान किए जाते हैं , जो एक के बाद एक स्टेटमेंट को निष्पादित करने से बिल्कुल अलग है और उस ऑर्डर को प्रभावित कर सकता है जिसमें ताले लगे हैं।
कुछ और के लिए, सबसे परिपक्व भाषा PL / pgSQL ( LANGUAGE plpgsql
) है। यह अच्छी तरह से काम करता है और पिछले दशक में हर रिलीज के साथ सुधार हुआ है, लेकिन यह एसक्यूएल कमांड के लिए गोंद के रूप में सबसे अच्छा काम करता है। यह भारी संगणना (SQL कमांड के साथ अन्य) के लिए नहीं है।
PL / pgSQL फ़ंक्शन तैयार किए गए कथनों जैसे प्रश्नों को निष्पादित करता है । कैश्ड क्वेरी प्लान को फिर से इस्तेमाल करने से कुछ प्लानिंग ओवरहेड से कट जाती है और उन्हें समकक्ष एसक्यूएल स्टेटमेंट की तुलना में थोड़ा तेज हो जाता है, जो परिस्थितियों के आधार पर ध्यान देने योग्य प्रभाव हो सकता है। इस संबंधित प्रश्न की तरह इसके दुष्प्रभाव भी हो सकते हैं:
यह तैयार किए गए बयानों के फायदे और नुकसान को वहन करता है - जैसा कि मैनुअल में चर्चा की गई है । अनियमित डेटा वितरण और बदलती डायनेमिक SQL के साथ तालिकाओं पर प्रश्नों के EXECUTE
लिए, बेहतर हो सकता है जब दिए गए पैरामीटर (ओं) के लिए एक अनुकूलित निष्पादन योजना से लाभ फिर से योजना की लागत को पछाड़ देता है।
चूंकि Postgres 9.2 सामान्य निष्पादन योजनाएं अभी भी सत्र के लिए कैश की गई हैं, लेकिन मैनुअल को उद्धृत करते हुए :
यह बिना किसी पैरामीटर के तैयार बयानों के लिए तुरंत होता है; अन्यथा यह केवल पाँच या अधिक निष्पादन के बाद उत्पन्न होती है, जिनकी योजना लागत अनुमानित औसत (ओवरहेड योजना सहित) जेनेरिक योजना लागत अनुमान से अधिक महंगी होती है।
हम दोनों दुनिया के अधिकांश समय (कम कुछ अतिरिक्त उपरि) का उपयोग किए बिना (ab) का सर्वोत्तम उपयोग करते हैं EXECUTE
। PostgreSQL Wiki में PostgreSQL 9.2 में नया क्या है इसका विवरण ।
12 पोस्ट करता है सामान्य या कस्टम योजनाओं को लागू करने के लिए अतिरिक्त सर्वर चरplan_cache_mode
का परिचय । विशेष मामलों के लिए, देखभाल के साथ उपयोग करें।
आप सर्वर साइड फ़ंक्शन के साथ बड़ी जीत हासिल कर सकते हैं जो आपके एप्लिकेशन से डेटाबेस सर्वर पर अतिरिक्त राउंड-ट्रिप को रोकते हैं । सर्वर को जितना संभव हो एक बार में निष्पादित करें और केवल एक अच्छी तरह से परिभाषित परिणाम लौटाएं।
जटिल कार्यों, विशेष रूप से टेबल फ़ंक्शन ( RETURNING SETOF record
या TABLE (...)
) के घोंसले के शिकार से बचें । क्वेरी प्लानर के लिए अनुकूलन अवरोधों के रूप में कार्य करने वाले ब्लैक बॉक्स हैं। उन्हें अलग से अनुकूलित किया जाता है, बाहरी क्वेरी के संदर्भ में नहीं, जो नियोजन को सरल बनाता है, लेकिन परिणाम कम हो सकता है। इसके अलावा, कार्यों की लागत और परिणाम के आकार का अनुमान मज़बूती से नहीं लगाया जा सकता है।
अपवाद इस नियम के लिए सरल एसक्यूएल कार्य (हैं LANGUAGE sql
) है, जो किया जा सकता है "inlined" अगर कुछ पूर्व शर्त पूरी होती हैं - । नील कॉनवे (उन्नत सामग्री) द्वारा इस प्रस्तुति में क्वेरी प्लानर कैसे काम करता है, इसके बारे में और पढ़ें ।
PostgreSQL में एक फ़ंक्शन हमेशा एक लेनदेन के अंदर स्वचालित रूप से चलता है । यह सब सफल होता है या कुछ भी नहीं। यदि अपवाद होता है, तो सब कुछ वापस लुढ़का हुआ है। लेकिन त्रुटि से निपटने है ...
यही वह स्थान है क्यों कार्य हैं नहीं वास्तव में "संग्रहित प्रक्रियाओं" (भले ही उस शब्द का प्रयोग होता, गुमराह)। कुछ आदेश जैसे लेन-देन ब्लॉक के अंदर चल सकते हैं VACUUM
, CREATE INDEX CONCURRENTLY
या CREATE DATABASE
नहीं चल सकते हैं, इसलिए उन्हें कार्यों में अनुमति नहीं है। (न तो SQL प्रक्रियाओं में, फिर भी, पोस्टग्रेज 11 के रूप में। बाद में जोड़ा जा सकता है।)
मैंने वर्षों में हजारों plpgsql फ़ंक्शन लिखे हैं।