एक विशाल तालिका में एक सीरियल कॉलम जोड़ने का सबसे कुशल तरीका


10

एक बड़ी तालिका (~ 3 बिल। पंक्तियों, ~ 174 जीबी) में एक बड़ा कॉलम जोड़ने का सबसे तेज़ तरीका क्या है ?

संपादित करें:

  • मैं चाहता हूँ स्तंभ मौजूदा पंक्तियों के लिए मान बढ़ा दी करने के लिए ( NOT NULL)।
  • मैंने एक भरण-पोषण सेट नहीं किया (जो पूर्वव्यापी में एक बुरे निर्णय की तरह दिखता है)।
  • मुझे डिस्क स्थान की कोई समस्या नहीं है, बस इसे जितना जल्दी हो सके उतना जल्दी करना चाहिए।

जवाबों:


12

क्या गलत है:

ALTER TABLE foo ADD column bar bigserial;

स्वचालित रूप से (1 से शुरू) अद्वितीय मूल्यों से भर जाएगा।

यदि आप प्रत्येक मौजूदा पंक्ति के लिए एक नंबर चाहते हैं, तो तालिका में प्रत्येक पंक्ति को अपडेट करना होगा । या तुम नहीं करते?

यदि यह मृत टुपल्स या डेटा पृष्ठों पर खाली स्थान का पुन: उपयोग नहीं कर सकता है तो तालिका को दो बार आकार दिया जाएगा। ऑपरेशन का प्रदर्शन FILLFACTOR100 से कम या बस यादृच्छिक मृत टुपल्स टेबल पर फैलने से बहुत फायदा हो सकता है । इसके अलावा आप 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;

समग्र रूप से काफी तेज हो सकता है। यह आपको बिना किसी ब्लोट के वेनिला टेबल (और इंडेक्स) के साथ छोड़ देता है।

आपको फ्री डिस्क स्थान की आवश्यकता है - पुरानी तालिका के आकार के आसपास, तालिका की स्थिति पर निर्भर करता है - वैसल रूम के रूप में। लेकिन टेबल ब्लोट की वजह से आपको पहले सरल तरीके की आवश्यकता होगी। फिर से, विवरण आपकी तालिका की स्थिति पर निर्भर करता है।


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