क्या PostgreSQL गैर-पूर्ण DEFAULTs के साथ कॉलम जोड़ने का अनुकूलन करता है?


10

मान के NOT NULLसाथ कॉलम जोड़ते समय DEFAULT- क्या PostgreSQL इस ऑपरेशन को ऑप्टिमाइज़ करता है?

यदि तालिका में n पंक्तियां हैं, तो एक नहीं-अनुकूलित परिवर्तन-तालिका-ऐड-कॉलम डिफ़ॉल्ट मान के n लिखता है - जो बहुत दर्दनाक हो सकता है, जाहिर है। ऑप्टिमाइज़ेशन के साथ DB तुरंत नया कॉलम बनाएगा, डिफ़ॉल्ट वैल्यू की सिर्फ एक कॉपी स्टोर करेगा जो कि उस समय के लिए उपयुक्त इंडेक्स डेटा संरचना में कोई भी नॉन-डिफॉल्ट वैल्यू न मिलने पर वापस कर दी जाएगी।

उदाहरण के लिए Oracle 11g में ऐसा अनुकूलन है

जवाबों:


16

PostgreSQL में ऐसा कोई तंत्र नहीं है।

हालाँकि, आप अभी भी इस तरह के तालिका परिवर्तन के अत्यधिक प्रभावों से बच सकते हैं।

निम्नलिखित कथन कथन / लेन-देन की अवधि के लिए मेज पर एक एक्सेस अनन्य लॉक प्राप्त करता है :

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

यह कथन कैटलॉग को बदलता है, फिर पूरी तालिका को फिर से लिखता है ताकि नए कॉलम में सभी पंक्तियों में डिफ़ॉल्ट मान हो। यदि तालिका में कई पंक्तियाँ हैं और अक्सर पर्याप्त रूप से एक्सेस की जा रही हैं, तो इससे कुछ अस्थायी समस्याएं हो सकती हैं।

इससे बचने के लिए, यथासंभव कम से कम विशेष लॉक को रखने का प्रयास करें:

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

चूंकि यह मूल रूप से कैटलॉग में केवल एक (वास्तव में दो) परिवर्तन है (कोई डेटा परिवर्तन नहीं होता है), यह बहुत तेजी से पूरा होगा। फिर अपनी आवश्यकताओं और तालिका के उपयोग के आधार पर, आप नए कॉलम को एक चरण में या बैचों में डिफ़ॉल्ट रूप से अपडेट कर सकते हैं, और समाप्त होने पर, कॉलम को सेट कर सकते हैं NOT NULL

एक इच्छा के सच होने के बारे में अपडेट: PostgreSQL 11 में यह सुविधा होगी। अधिक के लिए https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ देखें ।


4

हाँ, PostgreSQL 11 के साथ

यह सुविधा नया है और संस्करण 11 में उतरा है।

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

उपरोक्त एक ऐसी कमांड है जो इस अनुकूलन से प्रभावित होगी; लेकिन, यह कहा जाना चाहिए NOT NULLहै नहीं की आवश्यकता है। एक गैर-शून्य डिफ़ॉल्ट के साथ जोड़ा गया कोई भी नया कॉलम अभी अनुकूलित है। आप इस कमेटी में एंट्री पा सकते हैं। आपको इसके बारे में इस महान राइट-अप को भी देखना चाहिए , "पोस्टग्रेज 11 में एक मिसिंग लिंक: डिफॉल्ट्स के साथ फास्ट कॉलम निर्माण"

पूर्व PostgreSQL 11 वर्कअराउंड

यदि आप मेज पर अनन्य टेबल-लॉक से बचने की कोशिश कर रहे हैं, तो क्रेग रिंगर की सलाह का पालन करें,

  • एक के बिना एक कॉलम जोड़ें DEFAULT
  • ALTERयह DEFAULTबाद में जोड़ने के लिए तो यह नई सम्मिलित पंक्तियों पर लागू होता है
  • फिर प्रगतिशील बैच UPDATEs द्वारा मौजूदा पंक्तियों पर नए कॉलम को आबाद करें
  • जब सभी पंक्तियों का मूल्य होता है तो आप NOT NULLबाधा जोड़ते हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.