ব্যাখ্যা বিশ্লেষণ একটি plpgsql ফাংশন ভিতরে কোয়েরি জন্য কোন বিবরণ প্রদর্শন করে


18

আমি ভিতরে বেশ কয়েকটি জটিল প্রশ্নের সাথে পোস্টগ্রেএসকিউএল 9.3 এ একটি পিএল / পিজিএসকিউএল ফাংশনটি ব্যবহার করছি:

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
ড্যানিয়েল প্রকৃতপক্ষে

উত্তর:


15

প্রথমত, EXPLAINকলটির জন্য সঠিক সিনট্যাক্সের প্রয়োজন a SELECT। আপনি কেবল এসকিউএল এ খালি ফাংশন নাম লিখতে পারবেন না:

EXPLAIN ANALYZE SELECT f1();

অপ্টিমাইজেশান

পিএল / পিজিএসকিউএল ফাংশনগুলি ক্যোয়ার প্ল্যানারের কালো বাক্স । ক্যোয়ারী ভিতরে হয় শুধু অন্যান্য প্রশ্নের কিন্তু মত অপ্টিমাইজ আলাদাভাবে এবং প্রস্তুত বিবৃতিগুলির মতো একের পর এক, ও মৃত্যুদন্ড পরিকল্পনা সেশনের স্থিতিকাল ক্যাশে করা হতে পারে। বিবরণ:

EXPLAIN ফাংশন সংস্থা

ভালো লেগেছে @Daniel ইতিমধ্যে মন্তব্য, আপনি অতিরিক্ত মডিউল ব্যবহার করতে পারেন auto_explain আরো বিবরণ (পেতে প্রচুর বিবরণ)। Plpgsql ফাংশনের অভ্যন্তরে বিবৃতিগুলি "নেস্টেড স্টেটমেন্ট" হিসাবে বিবেচিত হয়। সেট করতে ভুলবেন না

SET auto_explain.log_nested_statements = ON

বিস্তারিত নির্দেশাবলী:

নিয়মের ব্যতিক্রম হিসাবে, খুব সাধারণ এসকিউএল ফাংশনগুলি (পিএলপিগএসকিএল নয়) "ইনলাইনড" হতে পারে, অর্থাৎ ফাংশন কোডটি বাহ্যিক ক্যোয়ারিতে isোকানো হয় এবং শুরু করার মতো কোনও ফাংশন না থাকায় সবকিছু কার্যকর করা হয়। কোয়েরি পরিকল্পনায় এ জাতীয় ক্ষেত্রে বিশদ তথ্য অন্তর্ভুক্ত রয়েছে।


নীচের মতো 'অটো_স্প্লেইন' সক্ষম করার পরে 'অটো_ এক্সপ্লেইন' লোড করুন; Auto_explain.log_min_duration = 0 সেট করুন; সেট অটো_এক্সপ্লিন.লগ_নেস্টড_স্টেটমেন্টস = চালু; SET অটো_এক্সপ্লিন.লগ_আনালিজে = সত্য; লগ ফাইলটিতে আমি নীচের ছবিটি পেয়ে যাচ্ছি, '2014-12-08 18:21:59 IST লগ: ক্লায়েন্টের কাছ থেকে ডেটা গ্রহণ করা যায়নি: কোনও সংযোগ তৈরি করা যায়নি কারণ টার্গেট মেশিন সক্রিয়ভাবে এটি প্রত্যাখ্যান করেছিল' যে কেউ আমাকে গাইড করতে পারে আসল সমস্যা ....
স্কুমার

দ্রষ্টব্য: plpgsql ফাংশনটি চালানোর পরে আমি লগ ফাইলের উপরের ছবিটি পেয়ে যাচ্ছি।
স্কুমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.