ป้ายกำกับ: Sql Optimization

สมองมนุษย์: Multitasking vs. Single-taskingสมองมนุษย์: Multitasking vs. Single-tasking

ในโลกของการพัฒนาซอฟต์แวร์และระบบข้อมูล ข้อมูลไม่ได้ไหลบ่ามาแค่จากภายนอกเท่านั้น แต่ยังรวมถึงความคาดหวังที่ให้เราต้องจัดการงานหลายอย่างพร้อมกัน (Multitasking) ซึ่งเป็นภาวะที่ทำให้เกิด Cognitive Load ทั้งกับสมองมนุษย์และประสิทธิภาพของโค้ด

ในฐานะ System Specialist เราทราบดีว่าการพยายามทำทุกอย่างพร้อมกัน ไม่ว่าจะเป็นการสลับบริบทในการทำงาน หรือการเขียน Query ที่ซับซ้อนเกินความจำเป็น มักนำไปสู่ผลลัพธ์ที่คุณภาพต่ำ ความผิดพลาดสูง และประสิทธิภาพที่ลดลง บทความนี้จะเปรียบเทียบแนวคิด Multitasking กับ Single-tasking โดยใช้หลักการของ PostgreSQL เพื่อแสดงให้เห็นว่า ‘การจดจ่อ’ (Single-tasking) คือกุญแจสำคัญสู่โค้ดที่มีประสิทธิภาพสูงสุด

🧠 Multitasking ในฐานข้อมูล: การสลับบริบทที่สิ้นเปลืองทรัพยากร

ในทางจิตวิทยา การทำหลายอย่างพร้อมกันคือภาพลวงตา (Myth) เพราะสมองต้องใช้พลังงานในการ ‘โหลด’ บริบทใหม่ทุกครั้ง ซึ่งเทียบได้กับการเขียนโค้ดที่ไม่เป็นระเบียบ หรือการรวม Logic หลายส่วนเข้าด้วยกันโดยไม่มีโครงสร้างที่ชัดเจน

ใน PostgreSQL หากเราพยายามจัดการข้อมูลหลายชุดพร้อมกันอย่างไม่เป็นระบบ (เช่น การใช้ UNION ที่ซับซ้อนเกินไป) Query นั้นจะกลายเป็น ‘Context Switching’ ทางโค้ด ทำให้ Optimizer ทำงานหนักและอ่านยาก เราต้องเสียทรัพยากรในการประมวลผลที่ไม่จำเป็น

ตัวอย่าง: Multitasking Code (Inefficient Context Switch)

สมมติว่าเราต้องการข้อมูลผู้ใช้ที่มาจากหลายแหล่งพร้อมกันโดยไม่มีการจัดลำดับที่ดี:

SQL

SELECT user_id, name FROM users WHERE status = 'active' UNION SELECT id, username FROM logs WHERE type = 'login';

Query ข้างต้นแม้จะทำงานได้ แต่ก็ขาดความต่อเนื่องทางตรรกะ (Logical Flow) ทำให้ยากต่อการบำรุงรักษาและอาจทำให้ประสิทธิภาพลดลงเมื่อข้อมูลมีขนาดใหญ่ขึ้น

✨ Single-tasking: พลังของการจดจ่อด้วย CTEs และ Recursive Logic

Single-tasking ในโลกของฐานข้อมูลคือการกำหนดขอบเขตงานให้ชัดเจน (Scope) และทำมันให้เสร็จสมบูรณ์ในขั้นตอนเดียว การใช้ Common Table Expressions (CTEs) หรือ `WITH RECURSIVE` คือตัวอย่างที่ดีที่สุดของการทำงานแบบ Deep Work เพราะเราบังคับให้ระบบประมวลผลตามลำดับตรรกะที่กำหนดไว้ทีละขั้น

การใช้ CTEs ช่วยให้โค้ดของเรามีโครงสร้างเหมือนการคิดเป็นขั้นตอน (Step-by-step thinking) ทำให้แต่ละส่วนของ Logic ถูกจัดการอย่างสมบูรณ์ก่อนที่จะส่งต่อผลลัพธ์ไปยังขั้นตอนถัดไป ซึ่งเป็นการเพิ่มประสิทธิภาพและลดภาระทางความคิดในการทำความเข้าใจ Query นั้น ๆ

ตัวอย่าง: Single-tasking Code (Deep Work with CTEs)

การใช้ Recursive CTE เพื่อจำลองการค้นหาข้อมูลแบบลำดับชั้น (Hierarchical Data):

SQL

WITH RECURSIVE department_hierarchy AS ( 
    SELECT dept_id, parent_dept_id, name FROM departments WHERE parent_dept_id IS NULL 
    UNION ALL 
    SELECT d.dept_id, d.parent_dept_id, d.name 
    FROM departments d JOIN department_hierarchy dh ON d.parent_dept_id = dh.dept_id 
) 
SELECT * FROM department_hierarchy ORDER BY dept_id;

โค้ดนี้แสดงถึงการจดจ่อกับงานเดียว: การสร้างโครงสร้างลำดับชั้นอย่างสมบูรณ์ (Single Goal) โดยใช้พลังของ CTEs ทำให้ Query มีความชัดเจนและมีประสิทธิภาพสูงกว่าการพยายามรวม Logic ที่ซับซ้อนทั้งหมดไว้ในคำสั่ง SELECT เดียว

🚀 บทสรุป: สร้างโค้ดที่โฟกัสเพื่อระบบที่ยั่งยืน

ไม่ว่าจะเป็นสมองมนุษย์หรือฐานข้อมูล PostgreSQL การจดจ่อกับภารกิจเดียว (Single-tasking) คือแนวทางปฏิบัติที่ดีที่สุดเสมอ เมื่อคุณเขียน Query ให้คิดเหมือนการทำงานแบบ Deep Work: กำหนดขอบเขตให้ชัดเจน ใช้ CTEs เพื่อแบ่ง Logic เป็นขั้นตอนย่อย ๆ และทำให้แต่ละส่วนนั้นสมบูรณ์ก่อนจะรวมเข้าด้วยกัน

การทำเช่นนี้ไม่เพียงแต่ช่วยเพิ่มประสิทธิภาพของฐานข้อมูลเท่านั้น แต่ยังช่วยให้โค้ดของคุณอ่านง่าย บำรุงรักษาง่าย และเป็นรากฐานที่มั่นคงสำหรับระบบขนาดใหญ่ในระยะยาว