& कनेक्ट करने के ओवरहेड को सहेजने के अलावा, जहां यह प्रत्येक अनुरोध पर अन्यथा किया जाता है, एक कनेक्शन पूलर बड़ी संख्या में क्लाइंट कनेक्शन को वास्तविक डेटाबेस कनेक्शनों तक सीमित कर सकता है। PostgreSQL में, सक्रिय डेटाबेस कनेक्शन की इष्टतम संख्या आमतौर पर कहीं ((2 * core_count) + effect_spindle_count) होती है। इस संख्या के ऊपर, थ्रूपुट और विलंबता दोनों खराब हो जाते हैं।
कभी-कभी लोग कहेंगे "मैं तेजी से प्रतिक्रिया समय के साथ 2000 उपयोगकर्ताओं का समर्थन करना चाहता हूं।" यह बहुत गारंटी है कि यदि आप 2000 वास्तविक डेटाबेस कनेक्शन के साथ ऐसा करने का प्रयास करते हैं, तो प्रदर्शन भयानक होगा। यदि आपके पास चार क्वाड-कोर प्रोसेसर वाली मशीन है और सक्रिय डेटा सेट पूरी तरह से कैश किया गया है, तो आप उन 2000 उपयोगकर्ताओं के लिए 35 डेटाबेस कनेक्शन के माध्यम से अनुरोधों को फ़नल करके बेहतर प्रदर्शन देखेंगे।
यह समझने के लिए कि यह सच क्यों है, इस विचार प्रयोग में मदद करनी चाहिए। साझा करने के लिए केवल एक संसाधन के साथ एक hypothetical डेटाबेस सर्वर मशीन पर विचार करें - एक कोर। यह कोर बिना किसी ओवरहेड के सभी समवर्ती अनुरोधों के बीच समान रूप से समय-टुकड़ा करेगा। आइए मान लें कि सभी अनुरोध एक ही पल में आते हैं, जिनमें से प्रत्येक को CPU समय के एक सेकंड की आवश्यकता होती है। कोर उन सभी पर काम करता है, उनमें से समय-टुकड़ा करना जब तक कि वे सभी 100 सेकंड बाद खत्म नहीं हो जाते। अब विचार करें कि क्या होता है यदि आप सामने कनेक्शन कनेक्शन डालते हैं जो 100 क्लाइंट कनेक्शन स्वीकार करेगा लेकिन डाटाबेस सर्वर पर एक समय में केवल एक ही अनुरोध करेगा, कनेक्शन को कतार में व्यस्त होने पर आने वाले किसी भी अनुरोध को डालने पर। अब जब एक ही समय में 100 अनुरोध आते हैं, तो एक ग्राहक को 1 सेकंड में प्रतिक्रिया मिलती है; दूसरे को 2 सेकंड में प्रतिक्रिया मिलती है, और अंतिम ग्राहक को 100 सेकंड में प्रतिक्रिया मिलती है। प्रतिक्रिया प्राप्त करने के लिए किसी को भी लंबे समय तक इंतजार नहीं करना पड़ा, थ्रूपुट समान है, लेकिन औसत विलंबता 100 सेकंड के बजाय 50.5 सेकंड है।
एक वास्तविक डेटाबेस सर्वर में अधिक संसाधन होते हैं जिनका उपयोग समानांतर में किया जा सकता है, लेकिन एक ही सिद्धांत धारण करने के बाद, एक ही सिद्धांत धारण करता है, आप केवल समवर्ती डेटाबेस अनुरोध जोड़कर चीजों को चोट पहुंचाते हैं। यह वास्तव में उदाहरण से भी बदतर है, क्योंकि अधिक कार्यों के साथ आपके पास अधिक कार्य स्विच हैं, ताले और कैश, एल 2 और एल 3 कैश लाइन विवाद के लिए विवाद बढ़ गया है, और कई अन्य मुद्दे जो थ्रूपुट और विलंबता दोनों में कटौती करते हैं। उस पर, जबकि उच्च work_mem
सेटिंग कई तरीकों से एक क्वेरी की सहायता कर सकती है, यह सेटिंग प्रत्येक कनेक्शन के लिए प्रति योजना नोड की सीमा है, इसलिए बड़ी संख्या में कनेक्शनों के साथ आपको इसे बहुत छोटा छोड़ने की आवश्यकता है फ्लशिंग कैश या यहां तक कि स्वैपिंग की ओर अग्रसर होता है, जिससे धीमी योजनाएं या ऐसी चीजें होती हैं जैसे हैश टेबल डिस्क पर फैलती हैं।
कुछ डेटाबेस उत्पाद सर्वर में एक कनेक्शन पूल प्रभावी ढंग से बनाते हैं, लेकिन PostgreSQL समुदाय ने स्थिति ले ली है क्योंकि क्लाइंट सॉफ़्टवेयर के करीब सबसे अच्छा कनेक्शन पूलिंग किया जाता है, इसलिए वे इसे प्रबंधित करने के लिए उपयोगकर्ताओं को छोड़ देंगे। अधिकतर पूलर्स के पास डेटाबेस कनेक्शन को हार्ड नंबर तक सीमित करने का कोई तरीका होगा, जबकि इससे अधिक समवर्ती ग्राहक अनुरोधों की अनुमति होगी, उन्हें आवश्यकतानुसार कतारबद्ध करें। यह वही है जो आप चाहते हैं, और इसे लेनदेन आधार पर, प्रति कथन या कनेक्शन पर नहीं किया जाना चाहिए।
यह भी एक मौका है कि आपका डेटाबेस मॉडल उन प्रश्नों से मेल नहीं खाता है जो आप इसे फायर कर रहे हैं। आम तौर पर, नेटवर्क ओवरहेड डिस्क से डेटा के ब्लॉक लाने के लिए आवश्यक काम की तुलना में बहुत छोटा होता है, यह भी प्रदर्शन की लागत नहीं है, केवल विलंबता। (शायद अक्सर लगातार कनेक्ट/डिस्कनेक्ट के मामले के लिए) – wildplasser