एमवीसीसी
सबसे पहले, यदि "सामान्य संचालन" में SELECT
. शामिल हैं प्रश्न, एमवीसीसी मॉडल स्वचालित रूप से इसका ख्याल रखेगा। UPDATE
SELECT
. को ब्लॉक नहीं करता है और इसके विपरीत। SELECT
केवल प्रतिबद्ध डेटा देखता है (या उसी लेन-देन में क्या किया गया है), इसलिए बड़े UPDATE
का परिणाम जब तक यह पूरा नहीं हो जाता (प्रतिबद्ध) अन्य लेन-देन के लिए अदृश्य रहता है।
प्रदर्शन / ब्लोट
अगर आपके पास उस तालिका को संदर्भित करने वाली अन्य वस्तुएं नहीं हैं,
और आपके पास समवर्ती लेखन कार्य नहीं हैं (जो खो जाएंगे!),
और आप टेबल पर एक बहुत छोटा अनन्य ताला लगा सकते हैं,
और निश्चित रूप से आपके पास अतिरिक्त डिस्क स्थान है:
आप पृष्ठभूमि में तालिका का एक अद्यतन संस्करण बनाकर लॉकिंग को न्यूनतम रख सकते हैं। सुनिश्चित करें कि इसमें सब कुछ है एक ड्रॉप-इन प्रतिस्थापन बनने के लिए, फिर मूल को छोड़ दें और डुप्ली का नाम बदलें।
CREATE TABLE tbl_new (LIKE tbl_org INCLUDING CONSTRAINTS);
INSERT INTO tbl_new
SELECT col_a, col_b, array[col] aS col_c
FROM tbl_org;
मैं उपयोग कर रहा हूँ CREATE TABLE (LIKE .. INCLUDING CONSTRAINTS)
, क्योंकि (यहाँ मैनुअल को उद्धृत करते हुए):
नॉट-नल बाधाओं को हमेशा नई तालिका में कॉपी किया जाता है। CHECK
बाधाओं को केवल तभी कॉपी किया जाएगा जब INCLUDING CONSTRAINTS
निर्दिष्ट किया गया है; अन्य प्रकार की बाधाओं को कभी भी कॉपी नहीं किया जाएगा।
सुनिश्चित करें, नई तालिका तैयार है। फिर:
DROP tbl_org;
ALTER TABLE tbl_new RENAME TO tbl_org;
परिणाम बहुत ही कम समय की विंडो में होते हैं, जहां टेबल को विशेष रूप से लॉक किया जाता है।
यह वास्तव में केवल प्रदर्शन के बारे में है। यह बिना किसी ब्लोट के जल्दी से एक नई तालिका बनाता है। यदि आपके पास विदेशी कुंजी या दृश्य हैं, तो आप अभी भी उस मार्ग पर जा सकते हैं, लेकिन आपको इन वस्तुओं को छोड़ने और फिर से बनाने के लिए एक स्क्रिप्ट तैयार करनी होगी, संभावित रूप से अतिरिक्त अनन्य ताले बनाना।
समवर्ती लेखन
समवर्ती लेखन कार्यों के साथ, वास्तव में आप जो कुछ भी कर सकते हैं, वह आपके अपडेट को विखंडू में विभाजित कर देता है। आप एक लेन-देन में ऐसा नहीं कर सकते, क्योंकि ताले केवल लेन-देन के अंत में जारी किए जाते हैं।
आप कर सकते थे रोजगार dblink , जो स्वयं सहित किसी अन्य डेटाबेस पर स्वतंत्र लेनदेन शुरू कर सकता है। इस तरह आप यह सब एक ही DO
. में कर सकते हैं लूप के साथ स्टेटमेंट या plpgsql फ़ंक्शन। यहाँ dblink पर अधिक जानकारी के साथ एक शिथिल संबंधित उत्तर दिया गया है:
- PostgreSQL में संग्रहीत कार्यविधि से डेटाबेस छोड़ें या बनाएं
कर्सर के साथ आपका दृष्टिकोण
फ़ंक्शन के अंदर एक कर्सर आपको कुछ भी नहीं खरीदेगा . कोई भी फ़ंक्शन स्वचालित रूप से लेन-देन में संलग्न होता है, और सभी ताले केवल लेन-देन के अंत में जारी किए जाते हैं। भले ही आपने CLOSE cursor
का उपयोग किया हो (जो आप नहीं करते) यह केवल कुछ संसाधनों को मुक्त करेगा, लेकिन नहीं मेज पर अधिग्रहीत ताले जारी करें। मैं मैनुअल उद्धृत करता हूं:
CLOSE
खुले कर्सर के नीचे स्थित पोर्टल को बंद कर देता है। इसका उपयोग लेन-देन के अंत से पहले संसाधनों को जारी करने के लिए या फिर से खोले जाने वाले कर्सर चर को मुक्त करने के लिए किया जा सकता है।
आपको अलग चलाने की आवश्यकता होगी लेन-देन या (ab) dblink का उपयोग करें जो आपके लिए ऐसा करता है।