อธิบายการวิเคราะห์ไม่แสดงรายละเอียดของการสืบค้นภายในฟังก์ชั่น plpgsql


18

ฉันใช้ฟังก์ชั่น PL / pgSQL ใน PostgreSQL 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()ฉันจะได้เวลาทั้งหมดเท่านั้น แต่ไม่มีรายละเอียด มีวิธีที่ฉันสามารถรับผลลัพธ์โดยละเอียดสำหรับคำค้นหาทั้งหมดในฟังก์ชันได้หรือไม่

หาก Postgres ไม่ควรปรับการค้นหาในฟังก์ชั่นฉันจะขอคำอธิบายด้วย


2
auto_explain.log_nested_statementsอาจช่วย ดูpostgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

คำตอบ:


15

ครั้งแรกไวยากรณ์ที่ถูกต้องสำหรับการเรียกร้องความต้องการEXPLAIN SELECTคุณไม่สามารถเขียนชื่อฟังก์ชั่นเปล่าใน SQL:

EXPLAIN ANALYZE SELECT f1();

การเพิ่มประสิทธิภาพ

ฟังก์ชั่น PL / pgSQL เป็นกล่องดำไปที่ผู้วางแผนเคียวรี การค้นหาภายในได้รับการปรับให้เหมาะสมเช่นเดียวกับข้อความค้นหาอื่น ๆ แต่แยกต่างหากและแบบหนึ่งต่อหนึ่งเช่นคำสั่งที่เตรียมไว้และแผนการดำเนินการอาจถูกแคชในช่วงระยะเวลาของเซสชัน รายละเอียด:

EXPLAIN ฟังก์ชั่นร่างกาย

เช่นเดียวกับ @Daniel แสดงความคิดเห็นแล้วคุณสามารถใช้โมดูลเพิ่มเติมauto_explainเพื่อรับรายละเอียดเพิ่มเติม (รายละเอียดมากมาย ) คำสั่งในฟังก์ชัน plpgsql ถือเป็น "ข้อความซ้อน" อย่าลืมตั้งค่า

SET auto_explain.log_nested_statements = ON

คำแนะนำโดยละเอียด:

เป็นข้อยกเว้นกฎฟังก์ชัน SQL ที่ง่ายมาก (ไม่ใช่ plpgsql) อาจเป็น "inlined" นั่นคือใส่รหัสฟังก์ชันลงในคิวรีด้านนอกและทุกอย่างจะถูกดำเนินการเหมือนไม่มีหน้าที่เริ่มต้น แผนแบบสอบถามรวมถึงข้อมูลรายละเอียดในกรณีดังกล่าว


หลังจากเปิดใช้งาน 'auto_explain' เช่นด้านล่างให้โหลด 'auto_explain'; ตั้ง auto_explain.log_min_duration = 0; ตั้ง auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true ฉันได้รับข้อความใน msg ในล็อกไฟล์ '2014-12-08 18:21:59 IST LOG: ไม่สามารถรับข้อมูลจากไคลเอนต์: ไม่สามารถทำการเชื่อมต่อได้เนื่องจากเครื่องเป้าหมายปฏิเสธอย่างแข็งขัน' ใคร ๆ ก็สามารถแนะนำฉันได้ ปัญหาที่แท้จริง ....
skumar

หมายเหตุ: หลังจากเรียกใช้ฟังก์ชั่น plpgsql ฉันจะได้รับ msg ในล็อกไฟล์เท่านั้น
skumar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.