วัน: 28 ตุลาคม 2021

UNION vs UNION ALL: รวมชุดข้อมูลอย่างไรไม่ให้ Performance ตก?UNION vs UNION ALL: รวมชุดข้อมูลอย่างไรไม่ให้ Performance ตก?

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


เจาะลึกรายละเอียดและประเด็นสำคัญ

ในทางเทคนิคแล้ว การรวมชุดข้อมูลด้วย SQL มีคำสั่งหลักๆ คือ UNION และ UNION ALL ซึ่งแม้จะมีจุดประสงค์เดียวกันคือการนำแถวจากหลาย Query มาต่อกัน แต่กลไกเบื้องหลังของทั้งสองคำสั่งนั้นแตกต่างกันอย่างสิ้นเชิง คำสั่ง UNION ไม่เพียงแค่รวมข้อมูลเท่านั้น แต่ยังมีการดำเนินการที่ซับซ้อนกว่า นั่นคือการกำจัดค่าที่ซ้ำกัน (Deduplication) โดยอัตโนมัติ

ในทางกลับกัน คำสั่ง UNION ALL เป็นเพียงการต่อแถวข้อมูลแบบตรงไปตรงมา (Concatenation) โดยไม่มีกระบวนการตรวจสอบหรือกำจัดค่าซ้ำใดๆ เลย การทำงานนี้ทำให้ UNION ALL มี Overhead ต่ำกว่ามาก และเป็นตัวเลือกที่เหนือกว่าในแง่ของความเร็ว หากคุณมั่นใจว่าชุดข้อมูลที่คุณกำลังรวมกันนั้นไม่มีแถวที่ซ้ำกัน หรือแม้แต่มี แต่การเก็บค่าซ้ำเหล่านั้นไว้ก็ยังจำเป็นต่อบริบททางธุรกิจ


การนำไปประยุกต์ใช้ในชีวิตและการทำงานยุคใหม่

  • เลือกใช้ UNION ALL เสมอเมื่อไม่จำเป็นต้องกำจัดค่าซ้ำ: หากคุณทราบล่วงหน้าว่าข้อมูลที่รวมกันมานั้นไม่มีโอกาสเกิดแถวที่เหมือนกัน หรือการเก็บค่าซ้ำมีความหมายทางธุรกิจ (เช่น การนับจำนวนรายการทั้งหมด) ให้ใช้ UNION ALL ทันที เพราะมันจะหลีกเลี่ยงขั้นตอนการ Sort และ Hash Table ที่กินทรัพยากรของระบบได้อย่างสิ้นเชิง
  • ใช้ UNION เมื่อจำเป็นต้องหาค่าที่ไม่ซ้ำกันจริงๆ เท่านั้น: หากคุณต้องการให้ผลลัพธ์สุดท้ายมีเพียงแถวที่ Unique จริงๆ (เช่น รายชื่อลูกค้าที่เคยทำรายการในหลายแผนก) การใช้ UNION ก็เป็นสิ่งที่ถูกต้อง แต่ควรพิจารณาทางเลือกอื่น เช่น การใช้ Common Table Expressions (CTEs) ร่วมกับ GROUP BY เพื่อควบคุมการทำงานให้ชัดเจนยิ่งขึ้น
  • ตรวจสอบ Schema และ Data Type ให้ตรงกันเสมอ: ไม่ว่าจะเป็น UNION หรือ UNION ALL ทุก Query ที่นำมารวมกันจะต้องมีจำนวนคอลัมน์และชนิดข้อมูล (Data Type) ของแต่ละคอลัมน์ที่สอดคล้องกัน มิฉะนั้นระบบฐานข้อมูลจะเกิดข้อผิดพลาดในการรันคำสั่ง

ในฐานะนักพัฒนาและผู้เชี่ยวชาญด้านฐานข้อมูล สิ่งสำคัญที่สุดไม่ใช่แค่การรู้ว่าคำสั่งใดทำงานอย่างไร แต่คือการเข้าใจ “ต้นทุน” (Cost) ที่แต่ละคำสั่งต้องจ่ายในการรันงาน การเลือกใช้ UNION ALL แทน UNION เมื่อทำได้ จึงเป็นหลักปฏิบัติที่ดีที่สุดที่ช่วยให้ Query ของคุณมีประสิทธิภาพสูงขึ้นอย่างเห็นได้ชัด และทำให้ระบบโดยรวมมีความเสถียรและตอบสนองได้อย่างรวดเร็ว


อ่านเพิ่มเติม