PostgreSQL MVCC के कारण, एक UPDATE
प्रभावी रूप से DELETE
. जैसा है प्लस एक INSERT
. टोस्टेड मूल्यों के उल्लेखनीय अपवाद के साथ - देखें:
- क्या पोस्टग्रेज अपडेट होने पर पूरी पंक्ति को फिर से लिखता है?
(और केवल टुपल्स के ढेर के लिए मामूली अंतर - DELETE
+ INSERT
एक नई HOT श्रृंखला शुरू करता है - लेकिन इसका मौजूदा केस पर कोई असर नहीं पड़ता है।)
सटीक होने के लिए, हटाए जाने के बाद शुरू होने वाले किसी भी लेनदेन के लिए "हटाई गई" पंक्ति अदृश्य है, और बाद में खाली हो गई है। इसलिए, डेटाबेस पक्ष पर, सूचकांक में हेरफेर सहित, प्रभाव में है कोई अंतर नहीं दो बयानों के बीच। (अपवाद लागू होते हैं, पढ़ते रहें।) यह नेटवर्क ट्रैफ़िक को थोड़ा बढ़ा देता है (आपके डेटा के आधार पर) और थोड़ी पार्सिंग की आवश्यकता होती है।
मैंने @araqnid के इनपुट के बाद कुछ और हॉट अपडेट का अध्ययन किया और कुछ परीक्षण चलाए। कॉलम पर अपडेट जो वास्तव में मान को नहीं बदलते हैं, कोई फर्क नहीं पड़ता जहां तक हॉट अपडेट की बात है। मेरा जवाब कायम है। नीचे विवरण देखें।
यह टोस्ट की गई विशेषताओं पर भी लागू होता है, क्योंकि उन्हें तब तक छुआ नहीं जाता जब तक कि मान वास्तव में परिवर्तित नहीं हो जाते हैं ।
हालांकि , यदि आप प्रति-स्तंभ ट्रिगर . का उपयोग करते हैं (पृष्ठ 9.0 के साथ प्रस्तुत), इसके अवांछित दुष्प्रभाव हो सकते हैं!
मैं ट्रिगर्स पर मैनुअल उद्धृत करता हूं:
<ब्लॉककोट>
... एक कमांड जैसे UPDATE ... SET x = x ...
एक ट्रिगर ऑनकॉलम सक्रिय करेगा x
, भले ही कॉलम का मान नहीं बदला ।
बोल्ड जोर मेरा।
अमूर्त परतें सुविधा के लिए हैं। वे SQL-अनपढ़ डेवलपर्स के लिए उपयोगी हैं या यदि एप्लिकेशन को विभिन्न RDBMS के बीच पोर्टेबल होने की आवश्यकता है। नकारात्मक पक्ष पर, वे कसाई प्रदर्शन कर सकते हैं और विफलता के अतिरिक्त बिंदुओं को पेश कर सकते हैं। जहां भी संभव हो मैं उनसे बचता हूं।
हॉट (हीप-ओनली टपल) अपडेट
हीप-ओनली टुपल्स को पोस्टग्रेज़ 8.3 के साथ पेश किया गया, जिसमें 8.3.4 और 8.4.9 में महत्वपूर्ण सुधार हुए।
पोस्टग्रेज़ 8.3 के लिए रिलीज़ नोट:
UPDATE
और DELETE
मृत टुपल्स को पीछे छोड़ दें, जैसा कि विफल रहा INSERT
s.पहले केवल VACUUM
मृत टुपल्स द्वारा ली गई जगह को पुनः प्राप्त कर सकता है। withHOT डेड टपल स्पेस को INSERT
. के समय स्वचालित रूप से पुनः प्राप्त किया जा सकता है या UPDATE
यदि अनुक्रमित स्तंभों में कोई परिवर्तन नहीं किया जाता है . यह अधिक सुसंगत प्रदर्शन के लिए अनुमति देता है। साथ ही, HOT डुप्लीकेट इंडेक्स प्रविष्टियों को जोड़ने से बचता है।
जोर मेरा। और "कोई परिवर्तन नहीं" में ऐसे मामले शामिल हैं जहां कॉलम उसी मान के साथ अपडेट किए जाते हैं जैसे उनके पास पहले से है। मैंने वास्तव में परीक्षण किया , जैसा कि मुझे यकीन नहीं था।
अंततः, स्रोत कोड में विस्तृत README.HOT इसकी पुष्टि करता है।
टोस्टेड कॉलम भी हॉट अपडेट के रास्ते में नहीं आते हैं। हॉट-अपडेटेड टपल संबंध के टोस्ट फोर्क में उसी, अपरिवर्तित टपल (ओं) से जुड़ता है। HOT अपडेट लक्ष्य सूची में टोस्टेड मानों के साथ भी काम करते हैं (वास्तव में बदले गए या नहीं)। यदि टोस्टेड मूल्यों को बदल दिया जाता है, तो यह स्पष्ट रूप से टोस्ट रिलेशन फोर्क को लिखता है। मैंने उन सभी का परीक्षण भी किया।
इसके लिए मेरा शब्द न लें, अपने लिए देखें। Postgres आँकड़ों की जाँच के लिए कुछ कार्य प्रदान करता है। अपना UPDATE
चलाएं सभी स्तंभों के साथ और उनके बिना और जांचें कि क्या इससे कोई फर्क पड़ता है।
-- Number of rows HOT-updated in table:
SELECT pg_stat_get_tuples_hot_updated('table_name'::regclass::oid)
-- Number of rows HOT-updated in table, in the current transaction:
SELECT pg_stat_get_xact_tuples_hot_updated('table_name'::regclass::oid)
या पीजीएडमिन का प्रयोग करें। अपनी तालिका चुनें और मुख्य विंडो में "सांख्यिकी" टैब का निरीक्षण करें।
ध्यान रखें कि HOT अपडेट केवल तभी संभव है जब मुख्य संबंध कांटे के एक ही पृष्ठ पर नए टपल संस्करण के लिए जगह हो। उस स्थिति को लागू करने का एक आसान तरीका एक छोटी सी तालिका के साथ परीक्षण करना है जिसमें केवल कुछ पंक्तियां होती हैं। पेज का आकार आम तौर पर 8k होता है, इसलिए पेज पर खाली जगह होनी चाहिए।