मेरे प्रश्न के 2 भाग हैं।
- क्या PostgreSQL में डेटाबेस के प्रारंभिक आकार को निर्दिष्ट करने का एक तरीका है?
- यदि समय के साथ डेटाबेस नहीं बढ़ता है, तो आप विखंडन से कैसे निपटते हैं?
मैंने हाल ही में MSSQL से Postgres में माइग्रेट किया है, और डेटाबेस बनाते समय हमने जो MSSQL दुनिया में किया था, उनमें से एक डेटाबेस और ट्रांजेक्शन लॉग के प्रारंभिक आकार को निर्दिष्ट करना था। इससे विखंडन कम हो गया और प्रदर्शन में वृद्धि हुई, खासकर अगर डेटाबेस का "सामान्य" आकार पहले से जाना जाता है।
आकार बढ़ने पर मेरे डेटाबेस का प्रदर्शन गिर जाता है। उदाहरण के लिए, जो कार्यभार मैं इसे सामान्य रूप से लगा रहा हूं उसमें 10 मिनट लगते हैं। जैसे-जैसे डेटाबेस बढ़ता है, यह समय बढ़ता है। VACUUM, VACUUM FULL और VACUUM FULL ANALYZE करने से समस्या हल नहीं होती है। क्या करता है प्रदर्शन समस्या का समाधान डेटाबेस को रोक रहा है, ड्राइव को डी-टुकड़े कर रहा है और फिर VACUUM FULL ANALYZE करने से मेरे परीक्षण का प्रदर्शन मूल 10 मिनट में वापस आ जाता है। इससे मुझे संदेह होता है कि विखंडन मुझे दर्द दे रहा है।
मैं पोस्टग्रेज में टेबलस्पेस / डेटाबेस स्पेस को स्टोर करने के लिए कोई संदर्भ नहीं पा सका हूं। या तो मैं गलत शब्दावली का उपयोग कर रहा हूं और इस प्रकार कुछ नहीं पा रहा हूं, या पोस्टग्रेज में फाइलसिस्टम विखंडन को कम करने का एक अलग तरीका है।
कोई संकेत?
समाधान
आपूर्ति किए गए उत्तरों से यह पुष्टि करने में मदद मिली कि मुझे क्या संदेह है। PostgreSQL डेटाबेस को कई फ़ाइलों में संग्रहीत करता है और यही वह है जो डेटाबेस को विखंडन की चिंता के बिना बढ़ने देता है। डिफ़ॉल्ट व्यवहार टेबल डेटा के साथ इन फ़ाइलों को ब्रिम में पैक करना है, जो उन तालिकाओं के लिए अच्छा है जो शायद ही कभी बदलते हैं लेकिन उन तालिकाओं के लिए बुरा है जो अक्सर अद्यतन होते हैं।
PostgreSQL तालिका डेटा के समवर्ती पहुँच प्रदान करने के लिए MVCC का उपयोग करता है । इस योजना के तहत, प्रत्येक अपडेट उस पंक्ति का एक नया संस्करण बनाता है जिसे अपडेट किया गया था (यह समय स्टाम्प या संस्करण संख्या के माध्यम से हो सकता है, कौन जानता है?)। पुराना डेटा तुरंत डिलीट नहीं किया जाता, बल्कि डिलीट करने के लिए चिह्नित किया जाता है। वास्तविक विलोपन तब होता है जब VACUUM ऑपरेशन किया जाता है।
यह भरण कारक से कैसे संबंधित है? 100 के टेबल डिफॉल्ट फिल फैक्टर पूरी तरह से टेबल पेजों को पैक करता है, जिसका अर्थ है कि अद्यतन पंक्तियों को रखने के लिए टेबल पेज के भीतर कोई स्थान नहीं है, अर्थात अद्यतन पंक्तियों को मूल पंक्ति से अलग टेबल पेज में रखा जाएगा। यह प्रदर्शन के लिए बुरा है, जैसा कि मेरा अनुभव दिखाता है। जैसे-जैसे मेरी सारांश सारणी बहुत बार अद्यतन (1500 पंक्तियों / सेकंड तक) हो जाती है, मैंने 20 का भरण कारक निर्धारित किया, अर्थात 20% तालिका सम्मिलित पंक्ति डेटा और अद्यतन डेटा के लिए 80% होगी। हालांकि यह अत्यधिक लग सकता है, अद्यतन पंक्तियों के लिए आरक्षित स्थान की बड़ी मात्रा का मतलब है कि अद्यतन पंक्तियाँ मूल के रूप में एक ही पृष्ठ के भीतर रहती हैं और जब तक अप्रचलित पंक्तियों को हटाने के लिए ऑटोवैक्यूम डेमन चलता है तब तक तालिका पृष्ठ पूर्ण नहीं होता है।
मेरे डेटाबेस को "ठीक" करने के लिए, मैंने निम्नलिखित कार्य किया।
- मेरे सारांश तालिकाओं के भरण कारक को 20 पर सेट करें। आप इसे TATE बनाने के लिए एक पैरामीटर पास करके या ALTER TABLE के माध्यम से तथ्य के बाद निर्माण समय पर कर सकते हैं । मैंने निम्नलिखित plpgsql कमांड जारी की:
ALTER TABLE "my_summary_table" SET (fillfactor = 20);
- एक VACUUM FULL को जारी किया गया, क्योंकि यह तालिका फ़ाइल का एक पूर्ण रूप से नया संस्करण लिखता है और इस प्रकार निहितार्थ द्वारा नए फिल कारक के साथ एक नई तालिका फ़ाइल लिखता है ।
मेरे परीक्षणों को पुन: व्यवस्थित करते हुए, मुझे डेटाबेस के बड़े होने पर भी कोई प्रदर्शन गिरावट नहीं दिखती है क्योंकि मुझे कई लाखों पंक्तियों के साथ रहने की आवश्यकता है।
TL; DR - फ़ाइल विखंडन का कारण नहीं था, यह टेबल स्पेस विखंडन था। यह आपके विशेष उपयोग के मामले के अनुरूप तालिका के भरण कारक को मोड़कर कम किया जाता है।