การทำงานของ fastupdate ใน GIN Index จะนำข้อมูลแถวใหม่ไปพักไว้ใน Pending List ก่อน แล้วค่อยนำไปควบรวม (Merge/Clean) เข้าสู่โครงสร้างหลัก การปรับจูนพารามิเตอร์ gin_pending_list_limit จึงเป็นหัวใจสำคัญในการควบคุมสมดุลระหว่างความเร็วในการเขียน (Write Performance), ปัญหา Write Amplification และความเร็วในการค้นหา (Read Performance)
1. ทำความเข้าใจปัญหา: เมื่อใดที่เกิด Write Amplification?
ค่าเริ่มต้นของ gin_pending_list_limit ใน PostgreSQL อยู่ที่ 4MB
- หากตั้งค่าน้อยเกินไป (เช่น ค่า default 4MB ในระบบ Write-heavy)
Pending List จะเต็มเร็วมาก ส่งผลให้คำสั่งINSERTหรือUPDATEธรรมดาของ Application ต้องกลายเป็นผู้รับภาระ (Victim Worker) ในการสั่งหยุดและทำการ Flush/Clean โครงสร้าง Index หลักแบบ Synchronous ทันที ทำให้เกิด Write Latency Spikes และ I/O กระชาก - หากตั้งค่าใหญ่เกินไป (เช่น 64MB – 128MB)
ลดความถี่ในการ Clean ได้ดี แต่ Query (SELECT) จะช้าลงอย่างหนัก เพราะทุกครั้งที่มีการอ่าน ข้อมูลใน Pending List ยังไม่ได้ถูกจัดทำ Index แบบ Inverted โครงสร้าง จึงต้องสแกน Pending List ทั้งหมดแบบ Sequential Scan ทีละแถวก่อนที่จะไปรวมผลกับ Index หลัก
2. แนวทางการปรับขนาด gin_pending_list_limit
แทนที่จะปรับแบบ Global ทั้งเซิร์ฟเวอร์ ให้กำหนดเฉพาะเจาะจงระดับ ราย Index (Per-Index Storage Parameter) ตามลักษณะเวิร์กโหลด
SQL
-- ปรับเพิ่มขนาด Pending List เป็น 16MB หรือ 32MB สำหรับ Index ที่มีการเขียนต่อเนื่อง
ALTER INDEX idx_products_details SET (gin_pending_list_limit = '32MB');