पोस्टग्रेएसक्यूएल में टेबल विभाजन को कैसे हटाया जाए, इसकी तलाश में यहां समाप्त होने वाले किसी भी व्यक्ति के लिए, यहां आधुनिक उत्तर है।
समाधान DELETE कथन का उपयोग नहीं करना है क्योंकि यह डेटा को रखने वाले संबंधित तालिका विभाजन को छोड़े बिना डेटा को हटा देगा। ओपी ने विभाजन तालिकाओं के प्रबंधन के बारे में पूछा, रिकॉर्ड को हटाने के बारे में नहीं, इसलिए DELETE कथनों का उपयोग करने वाला कोई भी समाधान रिकॉर्ड हटाने के अनावश्यक डेटाबेस ओवरहेड जोड़ता है, खाली विभाजन तालिका छोड़ देता है, और विभाजन का उपयोग करने के प्राथमिक लाभों में से एक को पूरी तरह से अनदेखा करता है; तालिका को तब गिराना जब वह उपयोगी न हो।
इस मामले में समाधान अब आवश्यक विभाजन तालिका को DROP करने के लिए होना चाहिए। मैंने अपने उत्पादन वातावरण में इस समस्या को हल करने के लिए एक समाधान लिखा है, इसका उत्तर है यहां ।
ओपी के मुद्दे को हल करने के लिए, मेरे द्वारा लिखे गए फ़ंक्शन का उपयोग fullTablename को संशोधित करने के लिए दो मामूली संशोधनों के साथ किया जा सकता है। परिवर्तनीय और दिनांक प्रारूप। fullTablename वेरिएबल लाइन को
. से बदला जाना चाहिएfullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
इस तरह YYYY-MM-DD_log प्रारूप में
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
फिर दिनांक प्रारूप को
. से थोड़ा संशोधित करने की आवश्यकता हैWHEN partition_plan='day' THEN 'YYYYDDD'
घोषित तालिका नामकरण सम्मेलन के लिए
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
फिर SQL क्वेरी जो क्लीनअप करने के लिए फ़ंक्शन को कॉल करती है उसे इस तरह की दैनिक रखरखाव स्क्रिप्ट से कॉल किया जा सकता है:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
जो YYYY-MM-DD_log टेबल को DROP कर देगा जो कि 5 . हैं 180 . से पुराने दिन दिन पहले। दर्जनों या सैकड़ों पुराने टेबल पार्टिशन को हटाने के लिए आरंभिक रन के लिए, 5 वांछित प्रभाव को प्राप्त करने वाले बहुत अधिक मूल्य पर सेट किया जा सकता है।