PlusMagi's Blog By Pitt Phunsanit Backend,Database คืนอำมหิต: อำมหิตไม่หยุดฆ่า (The Forever Purge)

คืนอำมหิต: อำมหิตไม่หยุดฆ่า (The Forever Purge)

ในฐานะ System Architect การจัดการวงจรชีวิตของข้อมูล (Data Lifecycle Management) ถือเป็นหัวใจสำคัญของการรักษาประสิทธิภาพและความเสถียรของระบบฐานข้อมูล การสะสมของข้อมูลเก่าที่ไม่มีการใช้งาน (Stale Data) ไม่เพียงแต่ทำให้พื้นที่จัดเก็บเต็มเท่านั้น แต่ยังส่งผลกระทบต่อประสิทธิภาพของการ Query และ Transaction ต่างๆ ซึ่งเปรียบเสมือนการปล่อยให้ระบบเกิด ‘อำมหิต’ ด้านประสิทธิภาพอย่างต่อเนื่อง

บทความนี้จะเจาะลึกถึงแนวทางปฏิบัติระดับ Senior Architect ในการ ‘Purge’ หรือทำความสะอาดข้อมูลใน PostgreSQL อย่างถูกหลักไวยากรณ์ เพื่อให้ระบบกลับมาทำงานได้อย่างเต็มประสิทธิภาพและปลอดภัย

🛠️ หลักการ Purge ข้อมูลใน PostgreSQL: การจัดการข้อมูลที่หมดอายุ

การ Purge ในบริบทของ PostgreSQL ไม่ได้หมายถึงการลบข้อมูลแบบสุ่ม แต่หมายถึงการลบข้อมูลที่เกินขอบเขตเวลา (Time-based) หรือข้อมูลที่สถานะการใช้งานได้เปลี่ยนไปแล้ว เราต้องใช้คำสั่ง SQL ที่แม่นยำเพื่อระบุและลบข้อมูลเหล่านั้นอย่างเป็นระบบ

🎯 การระบุขอบเขตข้อมูล (Defining the Scope)

สมมติว่าเรามีตารางบันทึก Log ชื่อ system_logs ที่มีคอลัมน์ log_timestamp และ log_data เราต้องการลบข้อมูลที่เก่ากว่า 90 วัน

SQL

DELETE FROM system_logs WHERE log_timestamp < NOW() - INTERVAL '90 days';

คำสั่งข้างต้นคือการใช้ DELETE ที่มีเงื่อนไข (WHERE clause) เพื่อลบแถวที่ตรงตามเกณฑ์เวลาที่กำหนด ซึ่งเป็นวิธีที่ปลอดภัยที่สุดในการ Purge ข้อมูล

🚀 เทคนิคขั้นสูง: การ Purge ข้อมูลจำนวนมากอย่างมีประสิทธิภาพ

หากข้อมูลที่ต้องลบมีจำนวนมหาศาล (Millions of records) การใช้ DELETE ครั้งเดียวอาจทำให้เกิด Transaction Log ขนาดใหญ่และทำให้ระบบช้าลง เราจึงควรใช้เทคนิคการ Purge แบบ Batch Processing หรือการใช้ Partitioning

💡 การใช้ Transaction และ Batch Deletion

เพื่อป้องกันการล็อกตาราง (Table Locking) นานเกินไป เราควรแบ่งการลบออกเป็นชุดๆ (Batches) โดยใช้ Loop หรือการทำ Transaction ย่อยๆ

SQL

DO $$ DECLARE batch_size INT := 10000; BEGIN LOOP FOR i IN 1..100 LOOP DELETE FROM system_logs WHERE log_timestamp < NOW() - INTERVAL '90 days' LIMIT batch_size; COMMIT; END LOOP; END $$ LANGUAGE plpgsql;

การใช้ DO $$ ... $$ LANGUAGE plpgsql ช่วยให้เราสามารถรันโค้ดเชิงกระบวนการ (Procedural Code) เพื่อควบคุมการลบเป็นชุดๆ ทำให้ระบบมีความเสถียรสูง

✅ การยืนยันความสมบูรณ์ (Verification and Conclusion)

ก่อนการ Purge ข้อมูลจริงเสมอ ควรทำการทดสอบด้วยคำสั่ง SELECT เพื่อตรวจสอบจำนวนแถวที่จะถูกลบก่อนเสมอ:

SQL

SELECT COUNT(*) FROM system_logs WHERE log_timestamp < NOW() - INTERVAL '90 days';

การจัดการข้อมูลที่ถูกต้องตามหลักการนี้ไม่เพียงแต่ช่วยประหยัดพื้นที่จัดเก็บเท่านั้น แต่ยังช่วยให้ Query ต่างๆ ทำงานได้รวดเร็วขึ้นอย่างเห็นได้ชัด ทำให้ระบบของเราสามารถทำงานได้อย่าง ‘สดใหม่’ และมีประสิทธิภาพสูงสุดตลอดเวลา