एक सामान्य, समर्थित विधि प्रतीत नहीं होती है, लेकिन कुछ तरकीबें हैं जो एक व्यक्तिगत क्वेरी की प्रगति का मूल्यांकन करने के लिए सीमित संदर्भों में उपयोग की जा सकती हैं। ये उनमे से कुछ है।
दृश्यों
जब किसी SELECT या UPDATE क्वेरी में कोई भी शामिल होता है nextval(sequence_name)
, या INSERT में एक nextval
डिफ़ॉल्ट रूप में एक गंतव्य स्तंभ होता है , तो वर्तमान अनुक्रम मान को दूसरे सत्र में बार-बार देखा जा सकता है SELECT sequence_name.last_value
। यह काम करता है क्योंकि अनुक्रम लेनदेन से बाध्य नहीं हैं। जब निष्पादन योजना ऐसी होती है कि क्वेरी के दौरान अनुक्रम को रैखिक रूप से बढ़ाया जाता है, तो इसे प्रगति संकेतक के रूप में उपयोग किया जा सकता है।
pgstattuple
Pgstattuple योगदान मॉड्यूल कार्यों कि सीधे डेटा पृष्ठों पर नज़र कर सकते हैं प्रदान करता है। ऐसा प्रतीत होता है कि जब ट्यूपल्स को एक खाली तालिका में डाला जाता है और अभी तक प्रतिबद्ध नहीं है, तो उन्हें फ़ंक्शन dead_tuple_count
से क्षेत्र में गिना जाता है pgstattuple
।
9.1 के साथ डेमो: एक खाली तालिका बनाएं
CREATE TABLE tt AS (n numeric);
आइए इसमें 10M पंक्तियाँ डालें:
INSERT INTO tt SELECT * FROM random() from generate_series(1,10000000);
दूसरे सत्र में, डालने के दौरान हर सेकंड pgstattuple की जाँच करें:
$ while true;
do psql -Atc "select dead_tuple_count from pgstattuple('tt')";
sleep 1;
done
परिणाम:
0
69,005
520,035
1013430
1492210
1990415
2224625
2772040
3314460
3928660
4317345
4743770
5379430
6080950
6522915
7190395
7953705
8747725
9242045
0
यह डालने के समाप्त होने पर वापस 0 पर गिर जाता है (सभी ट्यूपल्स दिखाई देते हैं और जीवित होते हैं)।
इस ट्रिक का उपयोग तब भी किया जा सकता है जब तालिका नए सिरे से नहीं बनाई जाती है, लेकिन प्रारंभिक dead_tuple_count
में एक गैर-शून्य मान होने की संभावना है और यह समवर्ती रूप से बदल सकता है यदि अन्य लेखन गतिविधि जैसे कि ऑटोवैक्यूम चल रहा है (संभवतः? नहीं? निश्चित रूप से क्या स्तर है? ऑटोवैक्युम के साथ उम्मीद करने के लिए संक्षिप्त नाम)।
हालाँकि इसका उपयोग तब नहीं किया जा सकता है , जब सृजन के लेन-देन के बाद से तालिका स्वयं ( CREATE TABLE ... AS SELECT
या SELECT * INTO newtable
) द्वारा बनाई गई हो । वर्कअराउंड टेबल को बिना पंक्तियों के जोड़ना (जोड़ना LIMIT 0
) होगा और इसे अगले लेनदेन में पॉप्युलेट करना होगा।
ध्यान दें कि pgstattuple
यह मुफ़्त नहीं है: यह हर कॉल पर पूरी तालिका को स्कैन करता है। इसके अलावा यह सुपरयुसर तक सीमित है।
कस्टम काउंटर
पावेल स्टेहुले के ब्लॉग में, वह C में लागू किया गया एक काउंटर फ़ंक्शन प्रदान करता है जो निर्दिष्ट संख्या में निष्पादन पर सूचनाएं बढ़ाता है। आपको फ़ंक्शन को किसी तरह क्वेरी के साथ संयोजित करना होगा ताकि निष्पादनकर्ता इसे कॉल कर सके। क्वेरी के दौरान नोटिस भेजे जाते हैं और उन्हें एक अलग सत्र की आवश्यकता नहीं होती है, केवल एक SQL क्लाइंट जो उन्हें प्रदर्शित करता है ( psql
स्पष्ट उम्मीदवार होने के नाते)।
INSERT INTO का उदाहरण नोटिस उठाने के लिए फिर से तैयार:
/* transformation */
INSERT INTO destination_table
SELECT (r).*
FROM (SELECT counter(to_destination_table(_source), 1000, true) r
FROM source _source) x
स्टैकओवरफ़्लो पर संबंधित प्रश्न, फ़ंक्शंस के लिए:
क्लाइंट के लिए लंबे समय से चल रहे पोस्टग्रेक्यूएल फ़ंक्शन से प्रगति की रिपोर्ट कैसे करें
भविष्य के विकल्प?
मई 2017 तक, डेवलपर्स समुदाय को एक आशाजनक पैच प्रस्तुत किया गया है:
[PATCH v2] लंबे समय तक चलने वाले SQL प्रश्नों की प्रगति की निगरानी करने के लिए प्रगति कमांड
जो PostgreSQL 11 या बाद में एक सामान्य समाधान के रूप में समाप्त हो सकता है। वे उपयोगकर्ता जो कार्य-प्रगति की प्रगति में भाग लेने का अनुभव करते हैं, वे पैच के नवीनतम संस्करण को लागू कर सकते हैं और प्रस्तावित PROGRESS
कमांड को आज़मा सकते हैं ।
pv
इससे पहले कमांड में नहीं आया था, और यह डिफ़ॉल्ट रूप से मेरे डेबियन सर्वर पर स्थापित नहीं था, लेकिन यह रेपो में है। विवरण कहता है कि "pv (पाइप व्यूअर) को दो प्रक्रियाओं के बीच किसी भी सामान्य पाइपलाइन में डाला जा सकता है ताकि डेटा कितनी जल्दी से गुजर रहा है, इसका एक दृश्य संकेत दे सके"। एक बहुत ही उपयोगी कमांड!