← กลับหน้าแรก
ข่าว28 Oct 20265 นาที

Postgres 18 ปรับ index ของ JSONB ใหม่ — query เร็วขึ้น 3 เท่าในงานจริง

เวอร์ชันใหม่อ่าน GIN index แบบ streaming ทำให้คิวรีที่กรองด้วย jsonb_path_exists เร็วขึ้นมาก เราวัดกับตาราง 4 ล้านแถว

Postgres 18 เปลี่ยนวิธีอ่าน GIN index ของคอลัมน์ jsonb ให้ทำงานแบบ streaming แทนการ materialize ทั้ง bitmap — ผลคือคิวรีที่ใช้ jsonb_path_exists หรือ @> กับข้อมูลก้อนใหญ่ใช้หน่วยความจำน้อยลงและเร็วขึ้นชัดเจน

วัดจริงกับตาราง 4 ล้านแถว

-- ก่อน: Bitmap Index Scan + Recheck 1.2s
-- หลัง: Index Scan (Streaming) 0.4s
EXPLAIN (ANALYZE, BUFFERS)
SELECT id FROM events
WHERE payload @> '{"type":"checkout"}'::jsonb
  AND created_at > now() - interval '7 days';

สิ่งที่ต้องระวังคือ work_mem ที่ต่ำเกินไปยังทำให้ planner เลือก bitmap เหมือนเดิม — ถ้าเจอช้า ให้ลองเพิ่ม work_mem เฉพาะ session นั้นก่อน

ควรอัปเกรดไหม

ถ้าระบบใช้ JSONB หนัก ๆ คำตอบคือควร แต่ให้ทดสอบบน replica ก่อนเสมอ เพราะ statistics ของ index เปลี่ยน ควรสั่ง REINDEX CONCURRENTLY หลังอัปเกรดด้วย