यहाँ गलतफहमी के कुछ जोड़े हैं:
अशक्त बिटमैप है नहीं ढेर टपल हैडर का हिस्सा है। प्रति प्रलेखन:
एक निश्चित आकार का हेडर है (अधिकांश मशीनों पर 23 बाइट्स पर कब्जा कर रहा है), इसके बाद एक वैकल्पिक नल बिटमैप ...
आपके 32 अशक्त स्तंभ दो कारणों से शुभ हैं:
अशक्त बिटमैप प्रति पंक्ति में जोड़ा जाता है , और केवल तभी जब पंक्ति में कम से कम एक वास्तविक NULLमूल्य हो। अशक्त स्तंभों का कोई प्रत्यक्ष प्रभाव नहीं होता है, केवल वास्तविक NULLमूल्य होते हैं। यदि नल बिटमैप आवंटित किया गया है, तो यह हमेशा पूरी तरह से आवंटित किया जाता है (सभी या कुछ भी नहीं)। नल बिटमैप का वास्तविक आकार 1 बिट प्रति स्तंभ है, अगले बाइट तक गोल है । वर्तमान करंट सॉप कोड:
#define BITMAPLEN(NATTS) (((int)(NATTS) + 7) / 8)
नल बिटमैप ढेर टपल हेडर के बाद आवंटित किया गया है और उसके बाद एक वैकल्पिक OID और फिर पंक्ति डेटा। OID या पंक्ति डेटा की शुरुआत t_hoffहेडर में इंगित की गई है। प्रति टिप्पणी स्रोत कोड :
ध्यान दें कि t_hoff अधिकतम MAXALIGN का होना चाहिए।
ढेर टपल हेडर के बाद एक मुफ्त बाइट है, जिसमें 23 बाइट्स हैं। तो 8 कॉलम तक की पंक्तियों के लिए नल बिटमैप प्रभावी रूप से बिना किसी अतिरिक्त लागत के आता है। तालिका में 9 वें कॉलम के साथ, एक और 64 कॉलम के लिए प्रदान करने के लिए एक t_hoffऔर MAXALIGN(आमतौर पर 8) बाइट्स उन्नत है । तो अगली सीमा 72 स्तंभों पर होगी ।
PostgreSQL डेटाबेस क्लस्टर (incl। MAXALIGN) की नियंत्रण जानकारी प्रदर्शित करने के लिए, डेबियन मशीन पर Postgres 9.3 की एक विशिष्ट स्थापना के लिए उदाहरण:
sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main
मैंने आपके द्वारा उद्धृत संबंधित उत्तर में निर्देश अपडेट किए ।
यह सब एक तरफ, भले ही आपका ALTER TABLEबयान एक पूरी तालिका को फिर से लिखना (जो शायद ऐसा करता है, एक डेटा प्रकार बदल रहा है), 250K वास्तव में इतना नहीं है और किसी भी आधे रास्ते सभ्य मशीन पर सेकंड का मामला होगा (जब तक कि पंक्तियां असामान्य रूप से बड़ी न हों) । 10 मिनट या अधिक पूरी तरह से अलग समस्या का संकेत देते हैं। आपका कथन तालिका पर ताला लगने की प्रतीक्षा कर रहा है, सबसे अधिक संभावना है।
pg_stat_activityअधिक खुले लेन-देन में प्रविष्टियों की बढ़ती संख्या - तालिका पर समवर्ती पहुंच को इंगित करता है (सबसे अधिक संभावना है) जिसे ऑपरेशन खत्म होने का इंतजार करना पड़ता है।
अंधेरे में कुछ शॉट
संभावित टेबल ब्लोट के लिए जाँच करें, एक सौम्य VACUUM mytableया अधिक आक्रामक प्रयास करें VACUUM FULL mytable- जो समान समसामयिक मुद्दों का सामना कर सकता है, क्योंकि यह फ़ॉर्म एक अनन्य लॉक का भी अधिग्रहण करता है। आप इसके बजाय pg_repack आज़मा सकते हैं ...
मैं अनुक्रमणिका, ट्रिगर, विदेशी कुंजी या अन्य बाधाओं के साथ संभावित मुद्दों का निरीक्षण करके शुरू करूंगा, विशेष रूप से उन स्तंभों को शामिल करना। विशेष रूप से एक दूषित सूचकांक शामिल हो सकता है? कोशिश करें REINDEX TABLE mytable;या DROPउनमें से सभी और ALTER TABLE उसी लेनदेन के बाद उन्हें फिर से जोड़ें ।
रात में या जब भी ज्यादा लोड न हो, कमांड चलाने की कोशिश करें।
एक जानवर-बल विधि सर्वर तक पहुंच को रोकने के लिए होगी, फिर पुन: प्रयास करें:
इसे नीचे पिन करने में सक्षम होने के बिना, वर्तमान संस्करण में अपग्रेड करना या आगामी 9.4 विशेष रूप से मदद कर सकता है। बड़ी तालिकाओं और लॉकिंग विवरण के लिए कई सुधार हुए हैं। लेकिन अगर आपके DB में कुछ टूट गया है, तो आपको संभवतः यह पता लगाना चाहिए कि पहले बाहर।
SET NOT NULLप्रकार में परिवर्तन नहीं करता है, यह सिर्फ एक बाधा कहते हैं - लेकिन बाधा किया जाना चाहिए जाँच की मेज के खिलाफ है, और है कि एक पूर्ण तालिका स्कैन की आवश्यकता है। 9.4 कमजोर ताले लेकर इनमें से कुछ मामलों में सुधार होता है, लेकिन यह अभी भी बहुत भारी है।