Section 6: Query Planner และ EXPLAIN
- Planner เลือกแผนอย่างไร: สถิติ, Cost และ ANALYZE
- อ่าน EXPLAIN (ANALYZE, BUFFERS) ทีละบรรทัดให้เห็นจุดที่ช้า
- Seq Scan, Index Scan, Bitmap Scan และวิธี Join แบบต่าง ๆ
- เปิด pg_stat_statements เพื่อหา Query ที่กินเวลารวมมากที่สุด
- Lab: ไล่หา Query ช้าจากแอปตัวอย่างแล้ววัดผลก่อนและหลังแก้
Section 7: Lab: ออกแบบ Index ให้ตรงกับ Query
- B-tree Index แบบ Composite และลำดับคอลัมน์ที่ถูกต้อง
- Partial, Expression และ Covering Index ด้วย INCLUDE
- B-tree Skip Scan ใน PostgreSQL 18 และผลต่อการออกแบบ Index
- เลือก GIN, GiST หรือ BRIN ให้เหมาะกับชนิดข้อมูล
- สาเหตุที่ Index ไม่ถูกใช้ และต้นทุนของ Index ที่มากเกินไป
Section 8: Transaction, MVCC และ Locking
- MVCC ทำงานอย่างไร และทำไมต้องมี VACUUM
- Isolation Level: Read Committed, Repeatable Read และ Serializable
- Row Lock, SELECT ... FOR UPDATE และการหา Lock ที่ค้างอยู่
- สาเหตุของ Deadlock และวิธีออกแบบโค้ดให้หลีกเลี่ยง
- Lab: สร้าง Job Queue ด้วย FOR UPDATE SKIP LOCKED
Section 9: PL/pgSQL, Procedure และ Trigger
- เขียน Function และ Procedure ด้วย PL/pgSQL พร้อมจัดการ Error
- Trigger สำหรับ Audit Log และการอัปเดต updated_at
- Function แบบ SQL เทียบกับ PL/pgSQL และเรื่อง Volatility
- เกณฑ์ตัดสินใจว่า Logic ใดควรอยู่ในฐานข้อมูล และส่วนใดควรอยู่ในแอป
Section 10: View, Materialized View และ Partitioning
- View สำหรับซ่อนความซับซ้อนและจำกัดการมองเห็นข้อมูล
- Materialized View และการ REFRESH ... CONCURRENTLY
- Declarative Partitioning แบบ Range และ List สำหรับตารางใหญ่
- Partition Pruning และการเลือก Partition Key ให้เหมาะกับ Query
- Lab: แบ่ง Partition ตาราง Log ตามเดือนและทดสอบผล