Postgres में समवर्ती अद्यतन का अनुकूलन


9

मैं समवर्ती पोस्टग्रेज प्रश्नों को चला रहा हूं:

UPDATE foo SET bar = bar + 1 WHERE baz = 1234

प्रत्येक क्वेरी पंक्तियों की निश्चित K संख्या को प्रभावित करती है, और मुझे उस क्रम को लागू करने का कोई तरीका नहीं मिल सकता है जिसमें पंक्तियों को अपडेट किया जाता है, मैं गतिरोध के साथ समाप्त होता हूं। वर्तमान में मैं हाथ से आदेश लागू करके समस्या को हल करता हूं, लेकिन इसका मतलब है कि मुझे सामान्य रूप से O (लॉग एन + के) (ओ लॉग (के लॉग एन) से खोज की जटिलता को बढ़ाने के साथ-साथ कई और प्रश्नों को भी निष्पादित करना होगा।

क्या गतिरोध की चपेट में आए बिना प्रदर्शन में सुधार करने का कोई तरीका है? मुझे संदेह है कि (baz)अनुक्रमणिका की जगह अनुक्रमणिका (baz, id)काम कर सकती है बशर्ते कि पोस्टग्रेज्स पंक्तियों को उसी क्रम में अपडेट करें जिस क्रम में उन्होंने इसे स्कैन किया है, क्या यह एक दृष्टिकोण है?


मेरा सुझाव है कि आप CREATE TABLEकोड जोड़ें ।
ypercube y

जवाबों:


15

आज्ञा ORDER BYमें नहीं है SQL UPDATE। मनमाने क्रम में अपडेट पंक्तियों को पोस्ट करता है:

पूर्ण निश्चितता के साथ गतिरोध से बचने के लिए, आप अपने बयानों को क्रमबद्ध लेनदेन अलगाव में चला सकते हैं । लेकिन यह अधिक महंगा है और आपको क्रमिक विफलता पर कमांड दोहराने की तैयारी करने की आवश्यकता है।

कार्रवाई का आपका सबसे अच्छा कोर्स संभवत: SELECT ... ORDER BY ... FOR UPDATEएक सबक्वेरी या SELECTलेनदेन में एक स्टैंडअलोन के साथ स्पष्ट रूप से लॉक करना है - डिफ़ॉल्ट रूप से "रीड प्रतिबद्ध" अलगाव स्तर। Pgsql-general पर टॉम लेन का हवाला देते हुए :

सब ठीक होना चाहिए --- फ़ॉर अपडाउन लॉकिंग हमेशा सेलेक्ट पाइपलाइन में अंतिम चरण है।

यह काम करना चाहिए:

BEGIN;

SELECT 1
FROM   foo 
WHERE  baz = 1234
ORDER  BY bar
FOR    UPDATE;

UPDATE foo
SET    bar = bar + 1
WHERE  baz = 1234;

COMMIT;

(baz, bar)प्रदर्शन पर एक बहुरंगी सूचकांक प्रदर्शन के लिए एकदम सही हो सकता है। लेकिन चूंकि barस्पष्ट रूप से बहुत अपडेट किया गया है , बस एक सिंगल-कॉलम इंडेक्स और (baz)भी बेहतर हो सकता है। कुछ कारकों पर निर्भर करता है। प्रति पंक्तियाँ कितनी हैं baz? क्या बहुरंगी सूचकांक के बिना HOT अपडेट संभव है? ...

यदि baz समवर्ती रूप से अद्यतन किया जाता है, तो अभी भी संघर्ष के प्रति असंभावना के मामले में संभावना नहीं है (प्रति प्रलेखन) :

लेन-देन आइसोलेशन स्तर SELECTपर चलने वाली कमांड READ COMMITTEDका उपयोग करना ORDER BYऔर आदेशों से पंक्तियों को वापस करने के लिए लॉकिंग क्लॉज का उपयोग करना संभव है । ...

इसके अलावा, अगर आप एक अद्वितीय को शामिल बाधा नहीं होनी चाहिए bar, एक पर विचार DEFERRABLEबाधा एक ही आदेश के भीतर अद्वितीय उल्लंघन से बचने के लिए। संबंधित उत्तर:


1
यदि मैं idइसके बजाय या किसी अन्य अद्वितीय कॉलम से ऑर्डर कर रहा हूं bar, तो कोने का मामला या प्रदर्शन हिट नहीं होना चाहिए, है ना?
एलेक्सी एवरचेन्को

@AlexeiAverchenko: हाँ, एक अनोखा स्तंभ जो कभी अपडेट नहीं किया जाता है, वह इसके लिए एकदम सही होगा - और इस कॉलम को दूसरे स्थान पर रखने वाला एक बहुस्तरीय सूचकांक।
इरविन ब्रान्डसेट्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.