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
, है ना?