การพูดอย่างเคร่งครัดคำว่า "โพรซีเดอร์ที่เก็บไว้" ชี้ไปที่โพรซีเดอร์ SQLใน Postgres ซึ่งรู้จักกับ Postgres 11
นอกจากนี้ยังมีฟังก์ชั่นทำเกือบ แต่ไม่เหมือนกันและมีอยู่ตั้งแต่ต้น
ฟังก์ชั่นที่มีLANGUAGE sql
อยู่ที่พื้นเพียงไฟล์ชุดที่มีคำสั่ง SQL ธรรมดาในห่อฟังก์ชั่น (และดังนั้นจึงอะตอมเสมอทำงานภายในเดียวทำธุรกรรม) พารามิเตอร์การยอมรับ งบทั้งหมดในฟังก์ชั่น SQL มีการวางแผนในครั้งเดียวซึ่งแตกต่างอย่างละเอียดจากการดำเนินการหนึ่งคำสั่งหลังจากที่อื่นและอาจส่งผลกระทบต่อการสั่งซื้อที่ถูกล็อค
สำหรับสิ่งใด ๆ เพิ่มเติมภาษาที่เป็นผู้ใหญ่ที่สุดคือPL / pgSQL ( LANGUAGE plpgsql
) มันทำงานได้ดีและได้รับการปรับปรุงทุกครั้งในช่วงทศวรรษที่ผ่านมา แต่มันทำหน้าที่ได้ดีที่สุดในฐานะกาวสำหรับคำสั่ง SQL มันไม่ได้มีไว้สำหรับการคำนวณหนัก (นอกเหนือจากคำสั่ง SQL)
ฟังก์ชั่น PL / pgSQL ดำเนินการสอบถามเช่นงบเตรียม การใช้แผนคิวรีแคชอีกครั้งจะเป็นการตัดค่าโสหุ้ยการวางแผนและทำให้เร็วกว่าคำสั่ง SQL ที่เทียบเท่ากันเล็กน้อยซึ่งอาจมีผลที่เห็นได้ชัดเจนขึ้นอยู่กับสถานการณ์ มันอาจมีผลข้างเคียงเหมือนในคำถามที่เกี่ยวข้องนี้:
นี้ดำเนินข้อดีและข้อเสียของการเตรียมงบ - ตามที่กล่าวไว้ในคู่มือ สำหรับการค้นหาบนตารางที่มีการกระจายข้อมูลที่ผิดปกติและพารามิเตอร์ที่แตกต่างกันแบบไดนามิก SQLด้วยEXECUTE
อาจทำงานได้ดีขึ้นเมื่อได้รับจากแผนการดำเนินการที่ปรับให้เหมาะสมสำหรับพารามิเตอร์ที่กำหนดเมื่อเทียบกับค่าใช้จ่ายของการวางแผนใหม่
เนื่องจากแผนการดำเนินการทั่วไปของ Postgres 9.2 ยังคงถูกแคชไว้สำหรับเซสชัน แต่การอ้างอิงคู่มือ :
สิ่งนี้เกิดขึ้นทันทีสำหรับคำสั่งที่เตรียมไว้โดยไม่มีพารามิเตอร์ ไม่เช่นนั้นจะเกิดขึ้นหลังจากการประหารชีวิตตั้งแต่ห้าครั้งขึ้นไปจะสร้างแผนที่มีค่าใช้จ่ายโดยประมาณเฉลี่ย (รวมถึงค่าใช้จ่ายในการวางแผน) มีราคาแพงกว่าการประมาณราคาแผนทั่วไป
เราได้รับประโยชน์สูงสุดจากโลกทั้งสองโดยส่วนใหญ่ (มีค่าใช้จ่ายเพิ่มEXECUTE
เล็กน้อย) โดยไม่ใช้ (ab) รายละเอียดมีอะไรใหม่ใน 9.2 PostgreSQLของ PostgreSQL วิกิพีเดีย
Postgres 12 แนะนำตัวแปรเซิร์ฟเวอร์plan_cache_mode
เพิ่มเติมเพื่อบังคับแผนทั่วไปหรือกำหนดเอง สำหรับกรณีพิเศษใช้ด้วยความระมัดระวัง
คุณสามารถลุ้นรางวัลใหญ่ด้วยฟังก์ชั่นฝั่งเซิร์ฟเวอร์ที่ป้องกันการไปกลับไปยังเซิร์ฟเวอร์ฐานข้อมูลเพิ่มเติมจากแอปพลิเคชันของคุณ ให้เซิร์ฟเวอร์ดำเนินการให้มากที่สุดในครั้งเดียวและให้ผลลัพธ์ที่กำหนดไว้อย่างดีเท่านั้น
หลีกเลี่ยงการซ้อนฟังก์ชันที่ซับซ้อนโดยเฉพาะฟังก์ชันตาราง ( RETURNING SETOF record
หรือTABLE (...)
) ฟังก์ชั่นเป็นกล่องดำวางตัวเป็นอุปสรรคในการเพิ่มประสิทธิภาพให้กับผู้วางแผนแบบสอบถาม ไม่ได้อยู่ในบริบทของการสืบค้นภายนอกซึ่งทำให้การวางแผนง่ายขึ้น แต่อาจส่งผลให้แผนสมบูรณ์แบบน้อยกว่า นอกจากนี้ยังไม่สามารถคาดการณ์ขนาดและต้นทุนของฟังก์ชันได้อย่างน่าเชื่อถือ
ยกเว้นกฎนี้มีฟังก์ชั่น SQL ง่าย ( LANGUAGE sql
) ซึ่งสามารถ"inlined" - ถ้าปัจจัยพื้นฐานบางส่วนจะได้พบกับ อ่านเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัววางแผนคิวรีในงานนำเสนอนี้โดย Neil Conway (เนื้อหาขั้นสูง)
ใน PostgreSQL ฟังก์ชั่นมักจะทำงานโดยอัตโนมัติภายในรายการเดียว ทั้งหมดนั้นสำเร็จหรือไม่ทำอะไรเลย หากมีข้อยกเว้นเกิดขึ้นทุกอย่างจะถูกย้อนกลับ แต่มีข้อผิดพลาดในการจัดการ ...
นั่นเป็นเหตุผลว่าทำไมฟังก์ชั่นจึงไม่ได้เป็น"ขั้นตอนการจัดเก็บ"อย่างแน่นอน(แม้ว่าบางครั้งจะมีการใช้คำศัพท์นั้นอาจทำให้เข้าใจผิด) คำสั่งบางคนชอบVACUUM
, CREATE INDEX CONCURRENTLY
หรือCREATE DATABASE
ไม่สามารถทำงานได้ภายในบล็อกธุรกรรมดังนั้นพวกเขาจะไม่ได้รับอนุญาตในการทำงาน (ทั้งในโพรซีเดอร์ SQL แต่ ณ Postgres 11 ซึ่งอาจถูกเพิ่มในภายหลัง)
ฉันเขียนฟังก์ชัน plpgsql หลายพันรายการในช่วงหลายปีที่ผ่านมา