क्या यह एक मेज पर VACUUM चलाने के लिए लायक है जो केवल INSERT प्राप्त करता है?


19

2015 की पुन: इन्वेंट टॉक में, AWS ने उल्लेख किया कि वैक्यूम को केवल अपडेट या हटाने के बाद ही नहीं, बल्कि आवेषण के बाद भी चलाया जाना चाहिए। यहाँ बात का प्रासंगिक हिस्सा है:

http://www.youtube.com/watch?v=tZXp19q8RFo&t=16m2s

माना जाता है कि कुछ क्लीनअप हैं जो ब्लॉक पर किए जाने चाहिए भले ही उन्हें केवल आवेषण मिले हों और यह क्लीनअप या तो पहली बार किया जा सकता है जब ब्लॉक का चयन किया जाता है (रीडिंग को धीमा करना) या वैक्यूम के दौरान। क्या यह सच है और यदि हां, तो वास्तव में क्या सफाई होनी चाहिए?

जवाबों:


15

tl; dr: यह प्रतिबद्ध होने के बाद डेटा पढ़ने वाली पहली प्रक्रिया संकेत बिट्स सेट करेगी। यह पृष्ठ को गंदा कर देगा, लेखन गतिविधि बनाएगा। दूसरी चीज़ VACUUM(लेकिन अन्य कमांड नहीं) पृष्ठ को सभी-दृश्यमान के रूप में चिह्नित करता है, यदि उपयुक्त हो। VACUUMअंततः टुपल्स को फ्रीज करने के लिए टेबल को हिट करना होगा।

जिस कार्य को सम्मिलित रूप से करने के बाद काम करने की आवश्यकता होती है, वह वास्तव में साफ-सुथरा नहीं होता है, कम से कम दूसरे कार्य के अर्थ में नहीं VACUUMहोता है। इससे पहले कि मैं विवरण में जाऊं, ध्यान दें कि यह उत्तर वर्तमान (अप्रकाशित) 9.6 कोड पर आधारित है और मैं स्ट्रीमिंग प्रतिकृति के प्रभावों की अनदेखी कर रहा हूं, भले ही यह दृश्यता पर प्रभाव डाल सकता है।

MVCC की वजह से , हर बार पोस्टग्रैज मूल्यांकन करता है कि क्या एक टपल को किसी प्रश्न के लिए दृश्यमान होना चाहिए, इस पर विचार करना चाहिए कि क्या कुछ अन्य मानदंडों के साथ, टुपल (xmin छिपे हुए क्षेत्र में दर्ज) को बनाया गया लेन-देन। वह चेक महंगा है, इसलिए जैसे ही यह पता चलता है कि सभी लेन-देन वर्तमान में खुले लेन-देन के लिए दिखाई दे रहे हैं, एक "संकेत बिट" टपल हेडर पर सेट है जो यह दर्शाता है। उस बिट की सेटिंग पृष्ठ को गंदगी करती है, जिसका अर्थ है कि उसे डिस्क पर लिखना होगा। यह बहुत भ्रामक हो सकता है यदि डेटा को पढ़ने का अगला आदेश एक SELECTहै जो अचानक बहुत अधिक ट्रैफ़िक बना रहा है। VACUUMइन्सर्ट के आने के बाद रनिंग से बचना होगा। एक और महत्वपूर्ण अंतर यह है किVACUUMक्या हमेशा एक पृष्ठ पर टुपल्स का संकेत देगा (जब तक कि उसे पृष्ठ पर सफाई लॉक मिल गया), लेकिन कमांड शुरू होने से पहले किए गए लेनदेन को सम्मिलित करते समय अधिकांश अन्य कमांड केवल संकेत देंगे ।

इन सभी संकेत बिट्स को लिखने के बारे में एक महत्वपूर्ण बिंदु यह है कि VACUUMथ्रॉटल किया जा सकता है (और ऑटोवैक्यूम डिफ़ॉल्ट रूप से थ्रॉटल किया जाता है)। अन्य आदेश थ्रॉटल नहीं किए गए हैं और जितनी जल्दी हो सके गंदे डेटा उत्पन्न करेंगे।

VACUUMसभी-दृश्यमान पृष्ठों को चिह्नित करने के लिए एकमात्र तरीका है, जो कुछ कार्यों के लिए एक महत्वपूर्ण प्रदर्शन विचार है (विशेष रूप से, सूचकांक केवल स्कैन करता है)। यदि आप एक बड़ी प्रविष्टि करते हैं, तो यह बहुत संभावना है कि कई पृष्ठ हैं जिनमें कुछ भी सम्मिलित नहीं है, लेकिन नए सम्मिलित हैं। VACUUMसंभावित रूप से उन पृष्ठों को सभी-दृश्यमान के रूप में चिह्नित कर सकते हैं, लेकिन केवल तभी जब पुराना चल रहा लेन VACUUM-देन डेटा डालने वाले लेनदेन की तुलना में नया था

क्योंकि MVCC कैसे काम करता है, tuples जो ~ 2 बिलियन से अधिक लेनदेन से पहले डाले गए थे उन्हें " जमे हुए " के रूप में चिह्नित किया जाना चाहिए । डिफ़ॉल्ट रूप से प्रत्येक 200M लेन-देन करने के लिए ऑटोवैक्यूम किक करेगा। वैक्यूम डालने के बाद वैक्यूम_फ्रीज_मिन_जेज के साथ मैनुअल वैक्यूम चलाना 0 के प्रभाव को कम करने में मदद कर सकता है। अधिक आक्रामक रूप से, आप डालने के बाद टेबल पर दौड़ सकते हैं । जब अगली फ्रीज़ स्कैन होगा, उस पर "घड़ी रीसेट करें"।VACUUM FREEZE

यदि आप विशिष्ट विवरण जानना चाहते हैं, HEAPTUPLE_LIVEतो कॉल को HeapTupleSatisfiesVacuum()अंदर करने के बाद मामले पर एक नज़र डालें lazy_scan_heap()HeapTupleSatisfiesVacuum()खुद भी देखें , और इसकी तुलना करें HeapTupleSatisfiesMVCC()

मेरी दो अन्य प्रस्तुतियाँ हैं जो दिलचस्प हो सकती हैं। पहला वीडियो http://www.pgcon.org/2015/schedule/events/829.en.html से उपलब्ध है , जबकि दूसरा (जो मुझे लगता है कि थोड़ा बेहतर था) https://www.youtube पर उपलब्ध है। com / घड़ी? v = L8nErzxPJjQ


यह बहुत दिलचस्प है, और यह भी बताते हैं कुछ में कुछ गन्दा पृष्ठों EXPLAIN (ANALYZE, BUFFERS) outputs. But, if I understand things correctly, some of the hint bits (at least * COMMITTED` और *INVALID) () पहले से ही द्वारा निर्धारित किया जा सकता है कर सकते हैं COMMITया ROLLBACK, है ना?
dezso

3
COMMIT और ROLLBACK वास्तव में डेटा पृष्ठों को नहीं छूते हैं, इसलिए नहीं, उन आदेशों को विशेष रूप से कभी संकेत नहीं दे सकता है। एक डीएमएल कमांड अभी भी xmin और xmax संकेत दोनों स्थितियों को निर्धारित कर सकता है, या तो अन्य लेनदेन द्वारा चिह्नित tuples के लिए या वर्तमान लेनदेन द्वारा चिह्नित भी tuples।
जिम नस्बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.