कार्य प्रदर्शन


46

एक MySQL पृष्ठभूमि से आ रहा है, जहां संग्रहीत कार्यविधि प्रदर्शन (पुराने लेख) और प्रयोज्य संदिग्ध हैं, मैं अपनी कंपनी के लिए एक नए उत्पाद के लिए PostgreSQL का मूल्यांकन कर रहा हूं।

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


क्या आपका मतलब है आप नहीं करते उल्लेख कुछ भी करने के लिए जवाब चाहते हैं नहीं प्रदर्शन से संबंधित?
जैक डगलस

क्रिस ट्रैवर्स संग्रहीत प्रक्रियाओं के उपयोग के लाभों के बारे में बहुत कुछ ब्लॉग करता है, जैसे यहाँ: ledgersmbdev.blogspot.de/2012/07/… और यहाँ: ledgersmbdev.blogspot.de/2012/07// बस अपने ब्लॉग के माध्यम से स्किम करें, वहाँ एक हैं इस विषय पर बहुत सारे रोचक लेख।
a_horse_with_no_name 18

जवाबों:


51

कड़ाई से बोलते हुए, शब्द "संग्रहीत कार्यविधियाँ" पोस्टग्रेज में एसक्यूएल प्रक्रियाओं को इंगित करता है , पोस्टग्रेज 11 के साथ पेश किया गया है। संबंधित:

वहाँ भी कार्य कर रहे हैं , लगभग नहीं बल्कि काफी समान हैं, और वे शुरू से ही रहे हैं।

कार्य के साथ LANGUAGE sqlमूल रूप से एक समारोह आवरण में सादे SQL कमांड (और इसलिए परमाणु, हमेशा एक अंदर चलाने के साथ सिर्फ बैच फ़ाइलें हैं एकल लेन-देन) को स्वीकार मानकों। एक एसक्यूएल फ़ंक्शन में सभी स्टेटमेंट एक बार में प्लान किए जाते हैं , जो एक के बाद एक स्टेटमेंट को निष्पादित करने से बिल्कुल अलग है और उस ऑर्डर को प्रभावित कर सकता है जिसमें ताले लगे हैं।

कुछ और के लिए, सबसे परिपक्व भाषा PL / pgSQL ( LANGUAGE plpgsql) है। यह अच्छी तरह से काम करता है और पिछले दशक में हर रिलीज के साथ सुधार हुआ है, लेकिन यह एसक्यूएल कमांड के लिए गोंद के रूप में सबसे अच्छा काम करता है। यह भारी संगणना (SQL कमांड के साथ अन्य) के लिए नहीं है।

PL / pgSQL फ़ंक्शन तैयार किए गए कथनों जैसे प्रश्नों को निष्पादित करता है । कैश्ड क्वेरी प्लान को फिर से इस्तेमाल करने से कुछ प्लानिंग ओवरहेड से कट जाती है और उन्हें समकक्ष एसक्यूएल स्टेटमेंट की तुलना में थोड़ा तेज हो जाता है, जो परिस्थितियों के आधार पर ध्यान देने योग्य प्रभाव हो सकता है। इस संबंधित प्रश्न की तरह इसके दुष्प्रभाव भी हो सकते हैं:

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

चूंकि Postgres 9.2 सामान्य निष्पादन योजनाएं अभी भी सत्र के लिए कैश की गई हैं, लेकिन मैनुअल को उद्धृत करते हुए :

यह बिना किसी पैरामीटर के तैयार बयानों के लिए तुरंत होता है; अन्यथा यह केवल पाँच या अधिक निष्पादन के बाद उत्पन्न होती है, जिनकी योजना लागत अनुमानित औसत (ओवरहेड योजना सहित) जेनेरिक योजना लागत अनुमान से अधिक महंगी होती है।

हम दोनों दुनिया के अधिकांश समय (कम कुछ अतिरिक्त उपरि) का उपयोग किए बिना (ab) का सर्वोत्तम उपयोग करते हैं EXECUTEPostgreSQL 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 फ़ंक्शन लिखे हैं।


2
@ न्हात्थ: "स्वचालित लेनदेन" एक तकनीकी शब्द नहीं है। यह कहने का एक बहुत ही सुंदर तरीका था .. मेरे स्पष्टीकरण के बाद अब यह क्या कह रहा है। स्वायत्त लेनदेन बिल्कुल नहीं। "स्वायत्त" बस एक समान शब्द होता है।
एरविन ब्रान्डेसटेटर

4
यहाँ से संकलित आपके उत्तर और SO एक महाकाव्य PostGreSQL सर्वश्रेष्ठ अभ्यास पुस्तिका हो सकते हैं।
दावोस

10

कुछ है:

  • जब संभव हो तो SQL का उपयोग फ़ंक्शन भाषा के रूप में करें, क्योंकि PG स्टेटमेंट को इनलाइन कर सकता है
  • IMMUTABLE / STABLE / VOLATILE का सही ढंग से उपयोग करें, क्योंकि PG अपरिवर्तनीय या स्थिर होने पर परिणामों को कैश कर सकता है
  • सही ढंग से STRICT का उपयोग करें, क्योंकि PG किसी फ़ंक्शन के चलाने के बजाय किसी इनपुट के रिक्त होने पर अशक्त हो सकता है
  • जब आप फ़ंक्शन भाषा के रूप में SQL का उपयोग नहीं कर सकते, तो PL / V8 पर विचार करें। यह मेरे द्वारा चलाए गए कुछ अवैज्ञानिक परीक्षणों में PL / pgSQL से तेज है
  • लंबे समय तक चलने वाली प्रक्रियाओं के लिए LISTEN / NOTIFY का उपयोग करें जो लेनदेन से बाहर हो सकते हैं
  • पेजेशन को लागू करने के लिए फंक्शंस का उपयोग करने पर विचार करें क्योंकि की-बेस्ड पेजिनेशन लिमिट आधारित पेजिनेशन से तेज हो सकता है
  • सुनिश्चित करें कि आप अपने कार्यों को यूनिट-टेस्ट करते हैं

यह पहली बार है जब मैंने दावा किया है कि PL / V8 PL / pgSQL की तुलना में तेज़ है। क्या आपके पास इसका समर्थन करने के लिए कोई (प्रकाशित) आंकड़े हैं?
a_horse_with_no_name

@a_horse_with_no_name नहीं, मैं नहीं। जैसा मैंने कहा, मैंने कुछ अवैज्ञानिक परीक्षण किए। वे ज्यादातर तर्क थे, डेटा एक्सेस नहीं। मैं यहाँ पर कुछ पुनरावर्ती परीक्षण करने की कोशिश करूँगा और फिर से पोस्ट करूँगा।
नील मैकगिन

@a_horse_with_no_name यहां FizzBuzz plv8 बनाम plpgsql: blog.databasepatterns.com/2014/08/plv8-vs.plpgsql.html
नील

8

आम तौर पर डेटाबेस में मूविंग एप्लिकेशन लॉजिक बोलने का मतलब होगा कि यह तेज है - आखिरकार यह डेटा के करीब चल रहा होगा।

मेरा मानना ​​है (लेकिन मुझे 100% यकीन नहीं है) कि SQL भाषा फ़ंक्शंस किसी भी अन्य भाषाओं का उपयोग करने वालों की तुलना में तेज़ हैं क्योंकि उन्हें संदर्भ स्विचिंग की आवश्यकता नहीं है। नकारात्मक पक्ष यह है कि किसी भी प्रक्रियात्मक तर्क की अनुमति नहीं है।

PL / pgSQL भाषाओं में निर्मित सबसे परिपक्व और सुविधा-पूर्ण है - लेकिन प्रदर्शन के लिए, C का उपयोग किया जा सकता है (हालांकि यह केवल कम्प्यूटेशनल रूप से गहन कार्यों को लाभ देगा)


7

आप postgresql में उपयोगकर्ता परिभाषित कार्यों (UDF) का उपयोग करके कुछ बहुत ही दिलचस्प चीजें कर सकते हैं। उदाहरण के लिए, दर्जनों संभावित भाषाएं हैं जिनका आप उपयोग कर सकते हैं। में निर्मित pl / sql और pl / pgsql दोनों सक्षम और विश्वसनीय हैं और कुछ भी बहुत खतरनाक करने से उपयोगकर्ताओं को रखने के लिए एक सैंडबॉक्स विधि का उपयोग करते हैं। सी में लिखे UDFs आपको शक्ति और प्रदर्शन में अंतिम रूप देते हैं, क्योंकि वे डेटाबेस के समान ही संदर्भ में चलते हैं। हालाँकि, यह आग से खेलने जैसा है, क्योंकि छोटी गलतियों से भी बड़ी समस्या पैदा हो सकती है, बैकएंड क्रैश या डेटा दूषित होने के साथ। Custome pl भाषाएँ, जैसे pl / R, pl / ruby, pl / perl, और इसी तरह आपको डेटाबेस और ऐप लेयर्स दोनों को एक ही भाषाओं में लिखने की क्षमता प्रदान करता है। यह आसान हो सकता है, क्योंकि इसका मतलब है कि आपको UDF लिखने के लिए एक पर्ल प्रोग्रामर जावा या pl / pgsql आदि नहीं पढ़ाना है।

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

अब, प्रदर्शन के मुद्दे के रूप में। यह एक ग्रे क्षेत्र है। क्या आप एक व्यक्ति के लिए एक ऐप लिख रहे हैं? या 1,000 के लिए? या 10,000,000 के लिए? जिस तरह से आप अपने ऐप का निर्माण करते हैं और यूडीएफ का उपयोग करते हैं, वह इस बात पर बहुत निर्भर करेगा कि आप किस तरह से स्केल करना चाहते हैं। यदि आप हजारों और हजारों उपयोगकर्ताओं के लिए लिख रहे हैं, तो मुख्य बात यह है कि आप जितना संभव हो सके db पर लोड कम करें। यूडीएफ जो डेटा को बाहर ले जाने और डेटाबेस में वापस लाने में मदद करते हैं, आईओ लोड को कम करने में मदद करेंगे। हालांकि, अगर वे सीपीयू लोड को बढ़ाना शुरू करते हैं, तो वे एक मुद्दा हो सकते हैं। आम तौर पर आईओ लोड कम करना पहली प्राथमिकता है, और यह सुनिश्चित करना कि यूडीएफ कुशल हो ताकि आपके सीपीयू को अधिभार न डालें।

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