ส่วนที่เกลียดที่สุดใน PostgreSQL
- ตลอด 5 ปีที่ผ่านมา PostgreSQL ได้กลายเป็น DBMS ที่ได้รับความนิยมสูงสุดบนอินเทอร์เน็ต เนื่องจากมีความน่าเชื่อถือ ความสามารถ ฟังก์ชันการทำงาน และเหมาะกับเวิร์กโหลดในการใช้งานจริงส่วนใหญ่
- อย่างไรก็ตาม วิธีที่ PostgreSQL ใช้ในการทำ multi-version concurrency control (MVCC) ถูกมองว่าแย่ที่สุดเมื่อเทียบกับ DBMS เชิงสัมพันธ์ตัวอื่น
Multi-version concurrency control คืออะไร?
- เป้าหมายของ MVCC คือทำให้หลายคิวรีสามารถอ่านและเขียนฐานข้อมูลพร้อมกันได้โดยไม่รบกวนกัน
- DBMS จะไม่เขียนทับแถวเดิม แต่เก็บหลายเวอร์ชันไว้ เพื่อให้คิวรีเลือกเวอร์ชันที่เหมาะสมมาสนองคำขอได้
- วิธีนี้ทำให้ไม่จำเป็นต้องใช้การล็อกเรคอร์ดแบบชัดเจน และช่วยให้คิวรีมองเห็นสแนปช็อตของฐานข้อมูลได้
Multi-version concurrency control ของ PostgreSQL
- เมื่ออัปเดตแถวเดิม PostgreSQL จะสร้างเวอร์ชันใหม่ขึ้นมาเพื่อบันทึกการเปลี่ยนแปลง โดยใช้วิธีจัดเก็บเวอร์ชันแบบ append-only
- วิธีนี้ก่อให้เกิดปัญหาซับซ้อนหลายอย่าง
การจัดเก็บหลายเวอร์ชัน
- PostgreSQL เก็บทุกเวอร์ชันของแถวไว้ในพื้นที่จัดเก็บเดียวกัน
- เมื่อมีการอัปเดต จะจัดสรรสล็อตสำหรับเวอร์ชันใหม่ คัดลอกเวอร์ชันเดิม แล้วจึงใช้การเปลี่ยนแปลง
- PostgreSQL ใช้ version chain เพื่อบันทึกความสัมพันธ์ระหว่างเวอร์ชันต่าง ๆ
การทำ vacuum ของเวอร์ชัน
- PostgreSQL ใช้กระบวนการ vacuum เพื่อลบเวอร์ชันเก่าที่หมดอายุแล้ว
autovacuum จะทำงานเป็นระยะเพื่อลบเวอร์ชันที่หมดอายุและนำพื้นที่กลับมาใช้ซ้ำ
ทำไม MVCC ของ PostgreSQL ถึงแย่ที่สุด
- การติดตั้งใช้งาน MVCC ของ PostgreSQL เป็นดีไซน์จากยุค 1980 ซึ่งไม่สอดคล้องกับรูปแบบระบบแบบ log-structured สมัยใหม่
- บทความนี้อธิบายปัญหาหลัก 4 ข้อที่เกิดจาก MVCC ของ PostgreSQL
ปัญหาที่ 1: การคัดลอกเวอร์ชัน
- PostgreSQL คัดลอกทุกคอลัมน์ไปยังเวอร์ชันใหม่ ทำให้เกิดข้อมูลซ้ำซ้อนและเพิ่มความต้องการด้านพื้นที่จัดเก็บ
- MySQL และ Oracle หลีกเลี่ยงปัญหานี้ด้วยการเก็บ delta แทน
ปัญหาที่ 2: ตารางบวม
- เวอร์ชันที่หมดอายุของ PostgreSQL ยังคงกินพื้นที่ และถ้า
autovacuum ลบออกไม่ได้ ฐานข้อมูลก็จะโตขึ้นเรื่อย ๆ
- สิ่งนี้ทำให้ประสิทธิภาพของคิวรีลดลง
ปัญหาที่ 3: การบำรุงรักษา secondary index
- PostgreSQL ต้องอัปเดตทุกอินเด็กซ์ทุกครั้งที่มีการอัปเดตข้อมูล
- สิ่งนี้ทำให้ประสิทธิภาพของคิวรีลดลง
ปัญหาที่ 4: การจัดการ vacuum
- ประสิทธิภาพของ PostgreSQL พึ่งพาความมีประสิทธิผลของ
autovacuum อย่างมาก
- หาก
autovacuum ทำงานได้ไม่ดี ก็จะเกิดปัญหาด้านประสิทธิภาพ
สรุปโดย GN⁺
- PostgreSQL ยังคงเป็น DBMS ที่ได้รับความนิยมมาก แต่แนวทางการทำ MVCC ของมันไม่ทันสมัย
- การแก้ปัญหา MVCC ของ PostgreSQL ต้องใช้เวลาและความพยายามอย่างมาก
- สามารถปรับแต่งการตั้งค่า
autovacuum ให้เหมาะสมเพื่อปรับปรุงประสิทธิภาพได้
- อาจพิจารณา MySQL และ Oracle เป็นทางเลือกสำหรับการแก้ปัญหา MVCC ของ PostgreSQL
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
OrioleDB พยายามแก้ปัญหาด้วย storage engine แบบใหม่
INSERTก็ไม่จำเป็นต้องใช้พื้นที่เพิ่มCOPY FROMการออกแบบของ PostgreSQL ไม่ได้แย่ไปทุกด้าน
การทำ MVCC ของ Oracle และ MySQL ไม่ได้เก็บที่อยู่ทางกายภาพของเวอร์ชันใหม่
เวลาอัปเดตแถวเดียวใน MySQL การทำ
SELECT id WHERE something; UPDATE what WHERE id=idเร็วกว่ามากในช่วงทศวรรษ 2010 MongoDB ถูกมองว่าเป็น "webscale" เพราะการเขียนแบบไม่รับประกันความทนทาน
ไม่เห็นด้วยกับคำอธิบายเกี่ยวกับ
pg_repackVACUUM FULLหนักก็จริง แต่ repack เป็นทางเลือกที่เร็วกว่าและเบากว่าเหตุผลที่ PostgreSQL ได้รับความนิยมมีดังนี้
มีคำถามว่าการเก็บ row-tuple เวอร์ชันใหม่ทั้งก้อนของ PostgreSQL เป็นคุณสมบัติของ storage engine พื้นฐานหรือไม่
บทความเขียนได้ดี อ่านง่าย และเข้าใจง่าย