क्या एक एकल PostgreSQL क्वेरी कई कोर का उपयोग कर सकती है?


56

PostgreSQL के हाल के संस्करणों में (दिसंबर 2013 के अनुसार), क्या हम एक प्रदर्शन को बढ़ावा देने के लिए दो या अधिक कोर के बीच एक क्वेरी साझा कर सकते हैं? या हमें तेजी से कोर मिलना चाहिए?

जवाबों:


48

नहीं, v9.6 से पहले PostgreSQL के संस्करणों के लिए। कृपया PostgreSQL FAQ देखें : PostgreSQL CPU संसाधनों का उपयोग कैसे करता है?

PostgreSQL सर्वर प्रक्रिया-आधारित (थ्रेडेड नहीं है)। प्रत्येक डेटाबेस सत्र एकल PostgreSQL ऑपरेटिंग सिस्टम (OS) प्रक्रिया से जुड़ता है । ओएस द्वारा कई उपलब्ध स्वचालित रूप से सभी उपलब्ध सीपीयू में फैला हुआ है। OS, डिस्क I / O को संभालने के लिए CPU का उपयोग करता है और अन्य गैर-डेटाबेस कार्यों को चलाता है। क्लाइंट एप्लिकेशन थ्रेड का उपयोग कर सकते हैं, जिनमें से प्रत्येक एक अलग डेटाबेस प्रक्रिया से जुड़ता है।

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


37

PostgreSQL 9.6+ के बाद, समानांतर-क्वेरी को अंततः PostgreSQL में देखना शुरू कर देगा।

उदाहरण के लिए समानांतर स्कैन / समानांतर जॉइन / समानांतर एग्रीगेट्स जैसे अवधारणाओं को अब पहले से ही बेक किया गया है, और जल्द ही आने के लिए।

वास्तव में रोमांचक यह है कि कुछ मामलों में पुष्टि करने वाली रिपोर्टें हैं near-linear speed-up, जो बहुत प्रभावशाली है!


8

नहीं, लेकिन वर्कअराउंड है। :)

मुझे पार्सल (समानांतर चयन) प्लस्पग्ल फ़ंक्शन मिला, जो प्राथमिक कुंजी के आधार पर आपकी क्वेरी को विभाजित करता है, फिर डेटाबेस से डब्लिंक एक्सटेंशन के माध्यम से जुड़ता है और सभी उपश्रेणियों का इंतजार करता है।

https://gist.github.com/mjgleaso/8031067

लेखक ने इस समारोह के बारे में लेख भी लिखा: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html


3

नहीं। प्रत्येक कनेक्शन सर्वर पर एक अलग प्रक्रिया को स्पॉन करता है।

आप pljava जैसी थ्रेडेड प्रक्रियात्मक भाषा का उपयोग करके कुछ समानता का "अनुकरण" कर सकते हैं। एक जावा प्रक्रिया (फ़ंक्शन) बनाएं जो कई थ्रेड लॉन्च करता है और कई श्रमिकों का उपयोग करके आउटपुट परिणाम बनाता है। बैकएंड को सिंक्रोनाइज़ किया जाता है ताकि प्रत्येक कार्यकर्ता आउटपुट को एसिंक्रोनस अपडेट कर सके।

जावा को थ्रेड समन्वय / सहयोग के लिए अच्छा समर्थन है।

उदाहरण के लिए, यह CPU गहन संचालन या नेटवर्क लंबाई संचालन के लिए अच्छा होगा।

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