मेरे पास "सर्वश्रेष्ठ" उत्तर नहीं है, लेकिन मेरे पास एक "कम से कम" उत्तर है जो आपको चीजों को यथोचित तेजी से प्राप्त करने की अनुमति दे सकता है।
मेरी तालिका में 2MM पंक्तियाँ थीं और जब मैं पहली बार डिफ़ॉल्ट सेकेंडरी टाइमस्टैम्प कॉलम को जोड़ने का प्रयास कर रहा था, तो अपडेट का प्रदर्शन कम था।
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
इसके 40 मिनट तक लटकाए रखने के बाद, मैंने एक छोटे से बैच पर यह कोशिश की कि यह अंदाजा लगाया जा सकता है कि इसमें कितना समय लग सकता है - पूर्वानुमान लगभग 8 घंटे का था।
स्वीकृत उत्तर निश्चित रूप से बेहतर है - लेकिन यह तालिका मेरे डेटाबेस में बहुत अधिक उपयोग की जाती है। कुछ दर्जन टेबल हैं जो उस पर FKEY; मैं इतने सारे टेबल पर FOREIGN KEY को स्विच करने से बचना चाहता था। और फिर विचार हैं।
डॉक्स, केस-स्टडीज़ और स्टैकओवरफ़्लो की थोड़ी खोज, और मुझे "ए-हा!" पल। यह ड्रेन कोर UPDATE पर नहीं था, बल्कि सभी INDEX ऑपरेशंस पर था। मेरी तालिका में इस पर 12 सूचकांक थे - कुछ अनूठे अवरोधों के लिए, कुछ क्वेरी प्लानर को गति देने के लिए, और कुछ पूर्ण खोज के लिए।
हर पंक्ति जो अद्यतन की गई थी वह केवल एक DELETE / INSERT पर काम नहीं कर रही थी, बल्कि प्रत्येक सूचकांक को बदलने और बाधाओं की जाँच करने के लिए भी उपर थी।
मेरा समाधान हर सूचकांक और बाधा को छोड़ना था, तालिका को अपडेट करना था, फिर सभी सूचकांक / बाधाओं को वापस जोड़ना था।
SQL ट्रांजेक्शन को लिखने में लगभग 3 मिनट का समय लगा जो कि निम्नलिखित था:
- शुरू;
- अनुक्रमित / बाधाएं गिरा दी गईं
- अद्यतन तालिका
- अनुक्रमणिका / बाधाओं को पुनः जोड़ें
- COMMIT;
स्क्रिप्ट को चलने में 7 मिनट का समय लगा।
स्वीकृत उत्तर निश्चित रूप से बेहतर और अधिक उचित है ... और वस्तुतः डाउनटाइम की आवश्यकता को समाप्त करता है। मेरे मामले में, हालांकि, उस समाधान का उपयोग करने के लिए इसे अधिक "डेवलपर" काम में लिया गया होगा और हमारे पास निर्धारित डाउनटाइम की 30 मिनट की खिड़की थी जिसे इसे पूरा किया जा सकता था। हमारे समाधान ने इसे 10 में संबोधित किया।
ALTER TABLE .. ADD COLUMN ...
या इसका उत्तर भी दिया जा सकता है?