एक बहुपक्षीय फ़ंक्शन के अंदर प्रश्नों के लिए कोई विवरण नहीं दिखाता है


18

मैं PostgreSQL 9.3 में एक PL / pgSQL फ़ंक्शन का उपयोग कर रहा हूं, जिसमें कई जटिल प्रश्न हैं:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

अगर मैं दौड़ता हूं EXPLAIN ANALYZE f1(), तो मुझे केवल कुल समय मिलता है, लेकिन कोई विवरण नहीं। क्या कोई तरीका है जिससे मुझे फ़ंक्शन के सभी प्रश्नों के लिए विस्तृत परिणाम मिल सकते हैं?

यदि समारोह में प्रश्नों को पोस्टग्रेज द्वारा अनुकूलित नहीं किया जाना चाहिए, तो मैं स्पष्टीकरण भी मांगूंगा।


2
auto_explain.log_nested_statementsमदद हो सकती है। देखें postgresql.org/docs/9.3/static/auto-explain.html
डैनियल verité

जवाबों:


15

सबसे पहले, EXPLAINकॉल के लिए सही सिंटैक्स की आवश्यकता है SELECT। आप SQL में नंगे फ़ंक्शन का नाम नहीं लिख सकते:

EXPLAIN ANALYZE SELECT f1();

अनुकूलन

PL / pgSQL फ़ंक्शन क्वेरी प्लानर के लिए ब्लैक बॉक्स हैं । प्रश्नों के अंदर कर रहे हैं सिर्फ अन्य प्रश्नों, लेकिन जैसे अनुकूलित अलग और तैयार बयान की तरह एक के बाद एक, और कार्य योजना लागू करके सत्र की अवधि के लिए कैश की जा सकती। विवरण:

EXPLAIN कार्य निकायों

जैसे @Daniel ने पहले ही टिप्पणी की थी, आप अधिक विवरण ( बहुत सारी जानकारी) प्राप्त करने के लिए अतिरिक्त मॉड्यूल auto_explain का उपयोग कर सकते हैं । Plpgsql फ़ंक्शन के अंदर के बयानों को "नेस्टेड स्टेटमेंट्स" माना जाता है। सेट करना सुनिश्चित करें

SET auto_explain.log_nested_statements = ON

विस्तृत निर्देश:

नियम के अपवाद के रूप में, बहुत ही सरल एसक्यूएल फ़ंक्शन (plpgsql नहीं) "इनबिल्ड" हो सकता है, अर्थात फ़ंक्शन कोड बाहरी क्वेरी में डाला जाता है और सब कुछ निष्पादित होता है जैसे कि शुरू करने के लिए कोई फ़ंक्शन नहीं था। क्वेरी योजना में ऐसे मामलों में विस्तृत जानकारी शामिल है।


नीचे दिए गए 'auto_explain' को सक्षम करने के बाद, 'auto_explain' लोड करें; सेट करें auto_explain.log_min_duration = 0; auto_explain.log_nested_statements = ON सेट करें; SET auto_explain.log_analyze = true; मुझे लॉग फ़ाइल में संदेश मिल रहा है, '2014-12-08 18:21:59 IST लॉग: क्लाइंट से डेटा प्राप्त नहीं कर सका: कोई कनेक्शन नहीं बनाया जा सका क्योंकि लक्ष्य मशीन ने सक्रिय रूप से मना कर दिया है' वास्तविक मुद्दा ....
स्कुमर

नोट: केवल plpgsql फ़ंक्शन चलाने के बाद, मैं लॉग फ़ाइल में msg से ऊपर हो रहा हूं।
स्कुमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.