Postgres के MVCC मॉडल के कारण , और एसक्यूएल के नियमों के अनुसार, प्रत्येक पंक्ति के UPDATE
लिए एक नया पंक्ति संस्करण लिखता है जो खंड में बाहर नहीं किया जाता है।WHERE
यह करता है प्रदर्शन पर एक कम या ज्यादा उल्लेखनीय प्रभाव सीधे और परोक्ष रूप है। "खाली अपडेट" में किसी भी अन्य अपडेट की तरह प्रति पंक्ति लागत होती है। वे किसी भी अन्य अपडेट की तरह ट्रिगर्स (यदि मौजूद हैं) में आग लगाते हैं, तो उन्हें वाल-लॉग होना पड़ता है और वे टेबल को ब्लॉट करने वाली मृत पंक्तियों का उत्पादन करते हैं और VACUUM
बाद में किसी भी अन्य अपडेट की तरह अधिक काम करते हैं ।
अनुक्रमणिका प्रविष्टियाँ और टोस्ट किए गए स्तंभ जहाँ शामिल किए गए किसी भी स्तंभ को नहीं बदला गया है , वही रह सकते हैं , लेकिन यह किसी भी अद्यतन पंक्ति के लिए सही है। सम्बंधित:
इस तरह के खाली अपडेट को बाहर करना लगभग एक अच्छा विचार है (जब वास्तविक मौका हो तो ऐसा हो सकता है)। आपने अपने प्रश्न में एक तालिका परिभाषा प्रदान नहीं की (जो हमेशा एक अच्छा विचार है)। हमें लगता है first_name
कि NULL हो सकता है (जो "पहले नाम" के लिए आश्चर्यजनक नहीं होगा), इसलिए क्वेरी को NULL-safe तुलना का उपयोग करना होगा :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
यदि first_name IS NULL
अद्यतन करने से पहले, केवल first_name <> 'Michael'
NULL का मूल्यांकन होगा और जैसे कि अद्यतन से पंक्ति को बाहर रखा जाएगा। डरपोक त्रुटि। यदि कॉलम परिभाषित किया गया हैNOT NULL
, तो साधारण समानता की जांच करें, हालांकि, क्योंकि यह थोड़ा सस्ता है।
सम्बंधित: