मैं एक ऐसे एप्लिकेशन का प्रबंधन करता हूं जिसमें एक बहुत बड़ी (लगभग 1TB डेटा एक तालिका में 500 मिलियन से अधिक पंक्तियों के साथ) Oracle डेटाबेस बैक एंड है। डेटाबेस वास्तव में कुछ भी नहीं करता है (कोई SProcs, कोई ट्रिगर या कुछ भी नहीं) यह सिर्फ एक डेटा स्टोर है।
हर महीने हमें मुख्य टेबल के दो से रिकॉर्ड को शुद्ध करने की आवश्यकता होती है। पर्स के मानदंड अलग-अलग होते हैं और यह पंक्ति की आयु और स्थिति क्षेत्रों के एक जोड़े का संयोजन होता है। हम आम तौर पर प्रति माह 10 से 50 मिलियन पंक्तियों के बीच की समाप्ति करते हैं (हम आयात के माध्यम से एक सप्ताह में लगभग 3-5 मिलियन पंक्तियों को जोड़ते हैं)।
वर्तमान में हमें यह डिलीट लगभग 50,000 पंक्तियों के बैचों में करना है (जैसे 50000 हटाएं, कॉमिट, 50000 डिलीट करें, कमिट करें, रिपीट करें)। एक समय में पूरे बैच को हटाने का प्रयास डेटाबेस को लगभग एक घंटे (पंक्तियों के # के आधार पर) के लिए गैर-जिम्मेदार बनाता है। बैचों में पंक्तियों को इस तरह से हटाना प्रणाली पर बहुत ही कठिन है और हमें आमतौर पर एक सप्ताह के दौरान इसे "समय परमिट" के रूप में करना पड़ता है; स्क्रिप्ट को लगातार चलाने की अनुमति देने से उपयोगकर्ता के लिए अस्वीकार्य प्रदर्शन में गिरावट आ सकती है।
मेरा मानना है कि इस तरह का बैच डिलीट करना इंडेक्स परफॉर्मेंस को भी खराब कर देता है और दूसरे इफेक्ट्स हैं जो आखिरकार डेटाबेस के प्रदर्शन को नीचा दिखाने का कारण बनते हैं। सिर्फ एक टेबल पर 34 इंडेक्स हैं, और इंडेक्स डेटा का आकार वास्तव में डेटा से बड़ा है।
यहाँ वह स्क्रिप्ट है जो हमारे एक आईटी लोग इस पर्स को करने के लिए उपयोग करते हैं:
BEGIN
LOOP
delete FROM tbl_raw
where dist_event_date < to_date('[date]','mm/dd/yyyy') and rownum < 50000;
exit when SQL%rowcount < 49999;
commit;
END LOOP;
commit;
END;
यह डेटाबेस 99.99999% होना चाहिए और हमें केवल 2 बार एक वर्ष में एक बार रखरखाव खिड़की मिल गई है।
मैं इन रिकॉर्ड्स को हटाने के लिए एक बेहतर विधि की तलाश कर रहा हूं, लेकिन मुझे अभी तक कोई भी नहीं मिला है। कोई सुझाव?