7 เหตุผล ที่ไม่ควรใช้ SELECT * เพื่อ Query ข้อมูล

25-เม.ย.-18

คัมภีร์เทพ IT

เชื่อว่า Programmer ทุกคน คงเคยใช้คำสั่ง SQL กันมาบ้างแล้ว และคำสั่งพื้นฐานที่ทุกคนถนัดและมักจะใช้กันบ่อยก็คือ SELECT * แต่วันนี้เรามาดูกันว่า คำสั่งที่เรามักใช้งานกันบ่อยๆ นี้ อาจจะไม่ค่อยเหมาะที่จะใช้เท่าไรนัก แต่จะมีเหตุผลอะไรบ้าง เราไปดูกันเลยครับ

1. เกิด Input/Output ที่ไม่จำเป็น

เมื่อคุณใช้ SELECT * คุณจะได้รับ Data ที่คุณไม่จำเป็นต้องใช้งานกลับมาด้วย และในการดึง Data เหล่านั้นมาใช้ มันก็ส่งผลอย่างอื่นด้วยเช่นกัน คือ ส่งผลให้เกิด Input/Output ที่เขียน/อ่านจาก Disk โดยไม่จำเป็น และเมื่อมีการ Read Data หรือ Index ทั้งหมด มันก็เป็นสาเหตุทำให้การ Query ข้อมูลนั้น “ช้าลง” อีกด้วย

2. Network Traffic เพิ่มสูงขึ้น

เมื่อใช้ SELECT * มันจะส่ง Data กลับมาให้มากกว่าที่คุณต้องการ ซึ่งจะทำให้ใช้ Network Bandwidth มากยิ่งขึ้น การเพิ่มขึ้นของ Network Bandwidth นั้นหมายถึงว่า Data จะใช้เวลานานกว่าจะไปถึง Client Application ซึ่งอาจเป็น SQL Server Management Studio (SSMS) หรือ Java Application Server ของคุณ

3. ใช้หน่วยความจำ Application เพิ่มขึ้น

เนื่องจากการเพิ่มขึ้นของ Data ทำให้ Application ของคุณต้องการใช้หน่วยความจำที่เพิ่มมากขึ้น เพื่อเก็บ Data ที่ไม่จำเป็นซึ่งไม่ได้ถูกนำไปใช้งาน

4. มี Dependency เรื่องลำดับของ Column ในผลลัพธ์

เมื่อคุณใช้คำสั่ง SELECT * ใน Application ของคุณ การเรียงลำดับของ Column ในการแสดงผลลัพธ์จะเปลี่ยนแปลงไป ถ้ามีการเพิ่ม Column ใหม่เข้าไป หรือมีการเปลี่ยนลำดับของ Column

5. การแสดงผลใน Views ผิดพลาด ขณะที่เพิ่ม Column ใหม่ลงใน Table

เมื่อใช้คำสั่ง SELECT * ใน View จากนั้นคุณอาจเผลอสร้าง Bug ด้วยการเพิ่ม Column ใหม่และลบบาง Column ออกจาก Table ไป ถามว่าเพราะอะไร? คำตอบคือ View ของคุณจะ Return ผลลัพธ์ที่ไม่ถูกต้องออกมาให้นั่นเอง และเพื่อหลีกเลี่ยงปัญหาดังกล่าว คุณควรระบุ WITH SCHEMABINDING ใน View ไว้ด้วยเสมอ ซึ่งวิธีนี้จะช่วยป้องกันปัญหาจากการใช้ SELECT * ใน View นั่นเอง

6. เกิด Conflict ใน JOIN Query

เมื่อใช้ SELECT * ในคำสั่ง JOIN query มันอาจสร้างความยุ่งยากให้คุณยิ่งขึ้น หาก Table ต่างๆ ดันมีบาง Column ที่มีชื่อเหมือนกัน เช่น status, active, name เป็นต้น จากการ Query ตรงๆ แบบนี้ มันอาจจะดี แต่เมื่อคุณพยายามที่จะเรียงลำดับ Column เหล่านั้น หรือใช้การ Query ใน Common Table Expression (CTE) หรือ Derived Table คุณจำเป็นต้องทำการปรับเปลี่ยนบางอย่าง

7. Copy ข้อมูลจาก Table หนึ่งไปยัง Table อื่น

การใช้คำสั่ง SELECT * into INSERT..SELECT statement ถือเป็นวิธีทั่วไปในการ Copy ข้อมูลจาก Table หนึ่งไปยัง Table อื่น เป็นไปได้ที่คุณอาจจะ Copy ข้อมูลที่ไม่ถูกต้องลงใน Column ที่ไม่ตรงกันด้วยหากลำดับของ Column ระหว่าง 2 Table ไม่เหมือนกัน

มี Programmer บางคนคิดว่าการใช้คำสั่ง SELECT * กับ SELECT 1 ร่วมกับคำสั่ง EXISTS จะช่วยทำให้เร็วขึ้น เนื่องจาก Query Parser จะทำงานมากเป็นพิเศษเพื่อที่จะ Validate ตัว Static Value นั้นอาจเป็นความจริงเมื่อในอดีต แต่ในปัจจุบัน Parser ได้ถูกพัฒนาให้มีความฉลาดมากพอที่จะรู้ได้ว่า ภายใน EXISTS clause นั้น, SELECT list มันไม่มีความเกี่ยวข้องกันเลย

และนั่นคือเหตุผลทั้งหมด ที่คุณไม่ควรใช้ SELECT * ใน SQL Query (ถ้าไม่จำเป็น) และมันจะดีกว่า ถ้าคุณใช้การระบุ Column ที่ชัดเจนในคำสั่ง SELECT แทนที่จะใช้ * ที่มันจะแสดงผลข้อมูลออกมาทั้งหมด ขณะเดียวกันการระบุร Column ไม่เพียงช่วยเพิ่ม Performance เท่านั้น แต่ยังช่วยให้ Code ของคุณดูมีความชัดเจนยิ่งขึ้น นอกจากนี้ยังช่วยให้คุณสามารถสร้าง Code ที่ Maintain ได้สะดวก และมันจะไม่สร้างปัญหาในกรณีที่เพิ่ม Column ใหม่ลงไปใน Table โดยเฉพาะอย่างยิ่งหากคุณมี View ซึ่งอ้างอิงไปถึง Table ต้นฉบับ

ที่มา: http://www.java67.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความที่เกี่ยวข้อง