अक्सर एक्सेस की गई टेबल से कई पंक्तियों को कैसे हटाएं

मुझे बहुत बड़ी तालिका के बहुमत (कहते हैं, 90%) को हटाने की आवश्यकता है (कहते हैं, 5 मीटर पंक्तियों)। इस तालिका का अन्य 10% अक्सर पढ़ा जाता है, लेकिन इसे लिखा नहीं जाता है।

से "आईडी द्वारा लाखों पंक्तियों को हटाने का सबसे अच्छा तरीका", मैं इकट्ठा करता हूं कि मुझे 90% I" हटाने पर किसी भी सूचकांक को हटा देना चाहिए, प्रक्रिया को तेज करने के लिए (एक सूचकांक को छोड़कर) मैं हटाने के लिए पंक्तियों का चयन करने के लिए उपयोग कर रहा हूं)।

से "PostgreSQL लॉकिंग मोड", मैं देख रहा हूं कि यह ऑपरेशन एक अधिग्रहण करेगा ROW EXCLUSIVE पूरी मेज पर ताला। लेकिन जब से मैं केवल एम पढ़ना अन्य 10%, यह बात नहीं करनी चाहिए।

तो, क्या एक कमांड में सब कुछ हटाना सुरक्षित है (अर्थात DELETE FROM table WHERE delete_flag="t")? मुझे चिंता है कि यदि एक पंक्ति का विलोपन विफल हो जाता है, तो ट्रिगर करना विशाल रोलबैक, तो यह तालिका से पढ़ने की मेरी क्षमता को प्रभावित करेगा। क्या बैचों में हटाना समझदारी होगी?

उत्तर:

उत्तर № 1 के लिए 4
  1. सभी पंक्तियों के 90% पर संचालन के लिए सूचकांक पूरी तरह से बेकार हैं। अनुक्रमिक स्कैन या तो तेजी से होगा।

  2. यदि आपको समवर्ती पठन की अनुमति देने की आवश्यकता है, तो आप मेज पर एक विशेष ताला नहीं लगा सकते। तो आप उसी लेन-देन में कोई इंडेक्स भी नहीं छोड़ सकते हैं।

  3. आप सकता है अलग-अलग लेनदेन में इंडेक्स को कम से कम अनन्य लॉक की अवधि रखने के लिए। और बाद में उपयोग करें CREATE INDEX CONCURRENTLY पृष्ठभूमि में सूचकांक के पुनर्निर्माण के लिए - और केवल एक बहुत ही विशेष अनन्य लॉक लें।

यदि आपके पास 10% पंक्तियों की पहचान करने के लिए एक स्थिर स्थिति है, तो मैं दृढ़ता से सुझाव देना चाहूंगा आंशिक सूचकांक दोनों के लिए सर्वश्रेष्ठ पाने के लिए बस उन पंक्तियों पर:

  • रीडिंग क्वेरीज़ हर समय (आंशिक सूचकांक का उपयोग करके) तालिका को हर समय एक्सेस कर सकती है।
  • बड़ा DELETE आंशिक अनुक्रमणिका को संशोधित करने के लिए नहीं जा रहा है, क्योंकि कोई भी पंक्तियाँ इसमें शामिल नहीं हैं DELETE

CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;

यह मानते हुए delete_flag है boolean। आपको अपने प्रश्नों में समान विधेय को शामिल करना होगा (भले ही यह तार्किक रूप से निरर्थक लगता है) यह सुनिश्चित करने के लिए कि पोस्टग्रैज समझता है कि यह आंशिक सूचकांक का उपयोग कर सकता है।


संबंधित सवाल
सबसे लोकप्रिय