ในรุ่นล่าสุดของ PostgreSQL (ณ เดือนธันวาคม 2013) เราสามารถแบ่งปันแบบสอบถามระหว่างสองคอร์หรือมากกว่านั้นเพื่อรับประสิทธิภาพที่เพิ่มขึ้นได้หรือไม่ หรือเราควรจะได้รับแกนเร็วขึ้น?
ในรุ่นล่าสุดของ PostgreSQL (ณ เดือนธันวาคม 2013) เราสามารถแบ่งปันแบบสอบถามระหว่างสองคอร์หรือมากกว่านั้นเพื่อรับประสิทธิภาพที่เพิ่มขึ้นได้หรือไม่ หรือเราควรจะได้รับแกนเร็วขึ้น?
คำตอบ:
ไม่เวอร์ชัน PostgreSQL ก่อนหน้า v9.6 โปรดดูคำถามที่พบบ่อยของ PostgreSQL : PostgreSQL ใช้ทรัพยากร CPU อย่างไร
เซิร์ฟเวอร์ PostgreSQL ใช้กระบวนการ (ไม่ใช่เธรด) เซสชั่นแต่ละฐานข้อมูลเชื่อมต่อกับซิงเกิ้ลของระบบปฏิบัติการ PostgreSQL (OS) กระบวนการ เซสชันหลายครั้งจะถูกกระจายไปทั่ว CPU โดยอัตโนมัติที่มีอยู่ทั้งหมดโดยระบบปฏิบัติการ ระบบปฏิบัติการยังใช้ CPU ในการจัดการดิสก์ I / O และเรียกใช้งานที่ไม่ใช่ฐานข้อมูลอื่น ๆ แอปพลิเคชันไคลเอนต์สามารถใช้เธรดซึ่งแต่ละโปรแกรมเชื่อมต่อกับกระบวนการฐานข้อมูลแยกต่างหาก
ตั้งแต่เวอร์ชัน 9.6 บางส่วนของเคียวรีสามารถรันแบบขนานในกระบวนการ OS แยกต่างหากซึ่งอนุญาตให้ใช้คอร์ CPU หลายตัว แบบสอบถามแบบขนานจะถูกเปิดใช้งานตามค่าเริ่มต้นในเวอร์ชัน 10 (max_parallel_workers_per_gather) โดยคาดว่าจะมีการขนานกันเพิ่มเติมในการเผยแพร่ในอนาคต
PostgreSQL 9.6+ ขึ้นไปจะเริ่มเห็น Parquery-Query ในที่สุดก็มาถึง PostgreSQL
สำหรับตัวอย่างแนวคิดเช่นParallel Scan / Parallel Join / Parallel Aggregatesตอนนี้ได้รับการอบเข้ามาแล้วและมีอีกมากมายที่จะมาในไม่ช้า
สิ่งที่น่าตื่นเต้นจริงๆคือมีรายงานยืนยันnear-linear speed-up
ในบางกรณีซึ่งค่อนข้างน่าประทับใจ!
ไม่ แต่มีวิธีแก้ปัญหา :)
ฉันพบ parsel (การเลือกแบบขนาน) ฟังก์ชั่น plpgsql ซึ่งแยกแบบสอบถามของคุณตามคีย์หลักแล้วเชื่อมต่อกับฐานข้อมูลผ่านส่วนขยาย dblink และรอคิวรีย่อยทั้งหมด
https://gist.github.com/mjgleaso/8031067
ผู้เขียนยังเขียนบทความเกี่ยวกับฟังก์ชั่นนี้: http://geeohspatial.blogspot.com/2013/12/a-simple-function-for-parallel-queries_18.html
ไม่แต่ละการเชื่อมต่อจะสร้างกระบวนการแยกต่างหากบนเซิร์ฟเวอร์
คุณสามารถ "เลียนแบบ" การขนานกันโดยใช้ภาษาโพรซีเดอร์เธรดเช่น pljava สร้างโพรซีเดอร์ Java (ฟังก์ชัน) ที่เปิดใช้หลายเธรดและสร้างผลลัพธ์ผลลัพธ์โดยใช้พนักงานหลายคน แบ็คเอนด์ได้รับการซิงโครไนซ์เพื่อให้ผู้ปฏิบัติงานแต่ละคนสามารถอัปเดตเอาต์พุตอะซิงโครนัส
Java มีการสนับสนุนที่ดีสำหรับการประสานงานของเธรด / ความร่วมมือ
เป็นตัวอย่างนี่จะเป็นสิ่งที่ดีสำหรับการใช้งาน CPU มากหรือการทำงานที่มีความยาวเครือข่าย