क्या गलत है:
ALTER TABLE foo ADD column bar bigserial;
स्वचालित रूप से (1 से शुरू) अद्वितीय मूल्यों से भर जाएगा।
यदि आप प्रत्येक मौजूदा पंक्ति के लिए एक नंबर चाहते हैं, तो तालिका में प्रत्येक पंक्ति को अपडेट करना होगा । या तुम नहीं करते?
यदि यह मृत टुपल्स या डेटा पृष्ठों पर खाली स्थान का पुन: उपयोग नहीं कर सकता है तो तालिका को दो बार आकार दिया जाएगा। ऑपरेशन का प्रदर्शन FILLFACTOR
100 से कम या बस यादृच्छिक मृत टुपल्स टेबल पर फैलने से बहुत फायदा हो सकता है । इसके अलावा आप VACUUM FULL ANALYZE
डिस्क स्थान को पुनर्प्राप्त करने के लिए बाद में चलाना चाह सकते हैं । हालांकि यह जल्दी नहीं होगा।
pgstattuple
आपको इस एक्सटेंशन में दिलचस्पी हो सकती है। यह आपकी टेबल पर आंकड़े इकट्ठा करने में आपकी मदद करता है। मृत टुपल्स और मुक्त स्थान के बारे में जानने के लिए:
डेटाबे के अनुसार एक बार एक्सटेंशन इंस्टॉल करें:
CREATE EXTENSION pgstattuple;
कॉल करें:
SELECT * FROM pgstattuple('tbl');
विकल्प
यदि आप एक नई तालिका बना सकते हैं, जो विचारों, विदेशी कुंजियों, के आधार पर टूट जाएगी ...
पुरानी तालिका की एक खाली प्रतिलिपि बनाएँ:
CREATE new_tbl AS
SELECT *
FROM old_tbl
LIMIT 0;
बड़ा स्तंभ जोड़ें:
ALTER new_tbl ADD column bar bigserial;
पुरानी तालिका से डेटा को स्वचालित रूप से भरना, बड़ी संख्या को भरना:
INSERT INTO new_tbl
SELECT * -- new column will be filled with default
FROM old_tbl
ORDER BY something; -- or don't order if you don't care: faster
नया बड़ा स्तंभ INSERT के चयन में गायब है और स्वचालित रूप से अपने डिफ़ॉल्ट मान से भर जाएगा । आप सभी स्तंभों को वर्तनी कर सकते हैं और उसी प्रभाव nextval()
में SELECT
सूची में जोड़ सकते हैं।
सुनिश्चित करें कि आपको अपना सारा डेटा नई तालिका में मिल गया है। अब
पुराने तालिका में आपके पास अनुक्रमित, बाधाएं, ट्रिगर जोड़ें ।
DROP TABLE old_tbl;
ALTER TABLE new_tbl RENAME TO old_tbl;
समग्र रूप से काफी तेज हो सकता है। यह आपको बिना किसी ब्लोट के वेनिला टेबल (और इंडेक्स) के साथ छोड़ देता है।
आपको फ्री डिस्क स्थान की आवश्यकता है - पुरानी तालिका के आकार के आसपास, तालिका की स्थिति पर निर्भर करता है - वैसल रूम के रूप में। लेकिन टेबल ब्लोट की वजह से आपको पहले सरल तरीके की आवश्यकता होगी। फिर से, विवरण आपकी तालिका की स्थिति पर निर्भर करता है।
fsync
एस से बच जाएगा