จาก blog เรื่อง PostgreSQL 19 beta ทำการปรับปรุงความสามารถของ partitioning table
คือการเพิ่มการ merge และ split partition เข้ามา (maintenance partition)
เพื่อช่วยแยกหรือรวมข้อมูลหลังจากที่ข้อมูลเกิดขึ้นมา
ซึ่งอาจจะไม่ตรงตามที่คิดหรือคาดหวังไว้
โดยมีคำถามเกี่ยวกับ partition table มันเป็นอย่างไร ?
จึงทำการอธิบายให้นิดหน่อยดังนี้
ก่อนอื่นต้องเข้าใจเรื่องของ partition table ก่อน
เป็นแนวทางในการแบ่งข้อมูลใน table เดียวกันออกเป็นกลุ่ม ๆ ตามความต้องการ
เช่นแบ่งตามวันเวลา
เช่นแบ่งตามกลุ่มของข้อมูล
เช่นแบ่งตามการ hash หรือใช้ modulo เอาก็ได้
เพื่อช่วยให้การจัดเก็บข้อมูล และ การเข้าถึงข้อมูลง่ายและรวดเร็วมากขึ้น
ยกตัวอย่างของปัญหา
เช่นการจัดเก็บข้อมูล order หรือ การคำสั่งซื้อในระบบ e-commerce
ปกติก็จะทำการเก็บลง table order ไปเรื่อย ๆ
ซึ่งจะใช้ disk/memory มาขึ้นเรื่อย ๆ
ไม่ใช้มีแค่ข้อมูลเท่านั้น แต่ยังไม่ index ต่าง ๆ ที่สร้างขึ้นมา
คำถามคือ
ข้อมูล order ที่จัดเก็บไปนั้นมีจำนวนเยอะหรือไม่ ?
การดึงข้อมูลเริ่มช้าลง เมื่อมีจำนวนข้อมูลมากขึ้น (table bloat) และ ผู้ใช้งานมากขึ้นไหม ?
แก้ไขเบื้องต้นด้วยการ restart database server เรื่อย ๆ ไหม ?
แก้ไขต่อมาด้วยการเพิ่ม Memory/CPU ของเครื่องให้เยอะขึ้นไหม ?
เริ่มทำการ ANALYZE Query และแก้ไขให้ดีขึ้น แต่ก็ยังช้าไหม ?
ไม่พอ ในการดึงข้อมูล order นั้น ส่วนใหญ่ใช้ข้อมูลอย่างไร ?
เช่น ส่วนใหญ่ดึงข้อมูล order เฉพาะในวันนั้น ๆ
ซึ่งอาจจะเป็นการใช้งาน 70-80% ของระบบงานเลย
แต่พอกลับมาดูการ query ข้อมูล แล้วพบว่า
ยัง query ข้อมูล order ทั้งหมด แล้วมา filter เฉพาะของวันนี้ !!
แบบนี้คิดว่า เป็นแนวทางที่ดีหรือไม่ ?
ถ้าบอกว่า ใช่ ก็จบตรงนี้
แต่ถ้าไม่ก็ไปต่อกัน
หนึ่งในแนวทางที่น่าสนใจคือ การใช้งาน partition data/table

โดยมีทั้งการแบ่ง partitioning table/data ใน PostgreSQL แบบเครื่องเดียวกัน
ดังนั้นจะติด limit ที่ resource ของเครื่องนั้น ๆ นั่นเอง
เพื่อความเข้าใจมาลองใช้งาน partition table กันดู
โดยการใช้งานนั้นจะมีขั้นตอนง่าย ๆ ดังนี้
- ต้องรู้การใช้งานข้อมูลใน table นั้นเป็นอย่างไร
- ทำการสร้าง table + partition key
- ทำการสร้าง partition table ขึ้นมาตาม partition key
- อย่าลืมสร้าง default partition table ด้วย เพราะว่า ถ้าไม่มี partition แล้ว ข้อมูลจะ insert/update ไม่ได้
สิ่งที่ควรรู้คือ สามารถเข้าถึงผ่านชื่อ table หลัก หรือ partition table ตรง ๆ ก็ได้
และ index ก็จะถูกสร้างแยกตาม partition table ไปเลย ทำให้ขนาดเล็ก และ การเข้าถึงเร็วขึ้น
และสิ่งที่สำคัญสุด ๆ อย่าดึงข้อมูลข้าม partition !!
ตัวอย่างเช่น table order จะแบ่งตาม order creation date เป็นรายเดือน
ส่วนการ query นั้นอย่าข้าม partition แบบนี้
นั่นหมายความว่า แทนที่จะแก้ปัญหา กลับสร้างปัญหาใหม่ขึ้นมามากกว่า !!
ลองใช้งานกันดูครับ
เป็นอีกหนึ่งแนวทางในการแก้ไขปัญหา