क्या चयन मृतक पंक्तियों को हटा देता है जैसे VACUUM करता है?


9

मैं VACUUMकुछ अप्रत्याशित व्यवहार पर ध्यान दे रहा था, जहां SELECTएक तालिका से पंक्तियों को लगता है कि कार्य को कम VACUUMकरना पड़ता है।

परीक्षण डेटा

नोट: ऑटोवैक्म अक्षम है

CREATE TABLE numbers (num bigint);
ALTER TABLE numbers SET (
  autovacuum_enabled = 'f',
  toast.autovacuum_enabled = 'f'
);

INSERT INTO numbers SELECT generate_series(1, 5000);

परीक्षण १

अब हम सभी पंक्तियों पर एक अपडेट चलाते हैं,

UPDATE numbers SET num = 0;

और जब हम दौड़ते हैं VACUUM (VERBOSE) numbers;तो हम प्राप्त करते हैं,

INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 5000 row versions in 23 pages
INFO:  "numbers": found 5000 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6585
There were 0 unused item pointers.

परीक्षण २

अब हम एक और जारी करते हैं UPDATE, लेकिन इस बार हम SELECTबाद में जोड़ते हैं ,

UPDATE numbers SET num = 1;
SELECT * FROM numbers;

और जब हम दौड़ते हैं VACUUM (VERBOSE) numbers;तो हम प्राप्त करते हैं,

INFO:  vacuuming "public.numbers"
INFO:  "numbers": removed 56 row versions in 22 pages
INFO:  "numbers": found 56 removable, 5000 nonremovable row versions in 45 out of 45 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 6586
There were 56 unused item pointers.

यहाँ वास्तव में क्या हो रहा है? दूसरा संस्करण जो मैं चलाता हूं, उसके बाद आने SELECTवाले पृष्ठों से मृत टुपल्स को हटाने के बाद , काफी पसंद VACUUMकरता है?

मैं MacOS 10.14.5 पर पोस्टग्रेज 11.3 चला रहा हूं।


2
अपने आदेशों को चलाने के लिए आप किस क्लाइंट का उपयोग करते हैं? क्या इसमें ऑटोकॉमिट सक्षम है?
मसिआको

2
मैं प्रश्न को हटाने जा रहा हूं "क्या वैक्युम टेबल मूल रूप से सिर्फ हुड के नीचे से तालिका * का चयन करें?" (यह नहीं है) मुझे लगता है कि यह एक अच्छा अनुवर्ती है, इसका उत्तर केवल यह है कि चयन मृत पंक्तियों को हटा सकता है, और यह वैक्युम के साथ साझा करता है। कैसे वे अलग हैं XID रोलओवर और अन्य चीजों के बारे में एक बहुत ही विस्तृत बातचीत होगी। यह प्रश्न मूल रूप से "मृत पंक्तियों को हटाने के अलावा वैक्यूम क्या करता है?" (जो अस्पष्ट की तरह होगा)
इवान कैरोल

@mustaccio मैंने ActiveRecord का उपयोग करके रूबी स्क्रिप्ट के साथ ये परीक्षण किए, जो हुड के नीचे PG रत्न का उपयोग करता है। मेरा मानना ​​है कि स्वतः पूर्णता डिफ़ॉल्ट रूप से सक्षम है क्योंकि आपको किसी भी कमिट को जारी करने की आवश्यकता नहीं है जब तक कि बीईजीआईएन का स्पष्ट रूप से उपयोग नहीं किया जाता है।
रफबम

जवाबों:


5

से / आर / PostgreSQL पर इस पोस्ट को एक करने के लिए Laurenz Albe द्वारा जवाब ऐसा लगता है कि ढेर केवल tuples (गर्म) के अपडेट जिम्मेदार हो सकता है। के वर्णन में से HOT अद्यतनsrc/backend/access/heap/README.HOT

प्रभावी रूप से, स्पेस रिक्लेमेशन टपल रिट्रीवल के दौरान होता है जब पृष्ठ लगभग पूर्ण होता है (<10% मुक्त) और एक बफर सफाई लॉक प्राप्त किया जा सकता है। इसका मतलब यह है कि UPDATE, DELETEऔर SELECTस्पेस रिक्लेमेशन को ट्रिगर कर सकता है, लेकिन अक्सर इस दौरान नहीं INSERT ... VALUESक्योंकि यह एक पंक्ति को पुनः प्राप्त नहीं करता है।

उद्धरण मूल उत्तर में नहीं है, लेकिन बाकी एक उद्धरण है,

इस सिद्धांत का समर्थन या खंडन करने के लिए, निम्नलिखित क्वेरी चलाएँ:

SELECT n_tup_upd, n_tup_hot_upd
FROM pg_stat_user_tables
WHERE schemaname = 'public' AND relname = 'TABLE_NAME';

यदि n_tup_hot_updशून्य से अधिक है, तो हमें एक मामला मिला है।


अब हम बात कर रहे हैं। +1
मस्टीको

लगता है कि HOT एक अच्छी व्याख्या है। यदि मैं CREATE INDEX idx_numbers ON numbers USING btree (num), VACUUM आउटपुट में परिवर्तन करता है INFO: "numbers": removed 5000 row versions in 45 pages। ध्यान दें कि सूचकांक-कम परिदृश्य में, n_tup_hot_updहमेशा 0 होता है, दोनों UPDATE और SELECT के बीच और SELECT और VIDEUUM के बीच। मैंने SELECT pg_sleep(10)प्रत्येक कथन के बीच चलना भी सुनिश्चित किया ताकि आंकड़े अद्यतित हों (मैं देखता हूं seq_scan: 2, एक अद्यतन के लिए और एक का चयन करें)।
रफबम

क्या इस मामले में चयन वाल उत्पन्न करता है? मैं इस धारणा के तहत था कि सेलेक्ट्स सब पर वाल उत्पन्न नहीं करते हैं। यदि हाँ, तो इसका मतलब होगा कि मृत पंक्तियों को हटाने से किसी दास का प्रचार हो जाता है। यदि नहीं, तो इसका मतलब है कि दास पर वैक्यूम करना अभी भी आवश्यक है। इसका मतलब यह भी होगा कि स्वामी और दास थोड़ा समान नहीं हैं। हम्म, शायद मुझे कुछ शोध करने और एक प्रश्न और / या उत्तर या दो पोस्ट करने की आवश्यकता है।
कोलिन 'टी हार्ट

1

एक unindexed टेबल के विशेष मामले में, हाँ, सेलेक्ट VACUUM (जहाँ तक मृत पंक्तियों को हटाने का संबंध है) के समान कार्य कर सकता है।


3
क्या आप एक स्पष्टीकरण जोड़ सकते हैं?
लॉरेंज एल्बे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.