ใน SQL Server 2012 (หรือรุ่นใดก็ได้ตั้งแต่ปี 2005 ขึ้นไป) การใช้SELECT *...
เป็นเพียงปัญหาด้านประสิทธิภาพที่เป็นไปได้ในคำสั่ง SELECT ระดับบนสุดของแบบสอบถาม
จึงไม่ได้เป็นปัญหาในการเข้าชม (*) ใน subqueries ในคำสั่งอยู่ใน CTEs และไม่ในSELECT COUNT(*)..
ฯลฯ ฯลฯ หมายเหตุว่านี้อาจจะยังเป็นจริงสำหรับ Oracle และ DB2 และอาจ Postgres (ไม่แน่ใจ) แต่มีโอกาสมากที่จะยังคงมีปัญหาในหลายกรณีสำหรับ MySql
เพื่อให้เข้าใจว่าทำไม (และทำไมมันถึงยังคงเป็นปัญหาใน SELECT ระดับบนสุด) มันจะมีประโยชน์ที่จะเข้าใจว่าทำไมมันเคยมีปัญหาซึ่งเป็นเพราะการใช้SELECT *..
หมายถึง " คืนคอลัมน์ทั้งหมด " โดยทั่วไปนี้จะกลับมาเป็นจำนวนมากข้อมูลได้มากขึ้นกว่าที่คุณต้องการจริงๆซึ่งเห็นได้ชัดว่าจะส่งผลให้จำนวนมากขึ้น IO ทั้งดิสก์และเครือข่าย
สิ่งที่ชัดเจนน้อยกว่าคือสิ่งนี้ยัง จำกัด ดัชนีและแบบสอบถามแผนใดที่ optimizer SQL สามารถใช้ได้เนื่องจากรู้ว่าท้ายที่สุดต้องส่งคืนคอลัมน์ข้อมูลทั้งหมด หากสามารถทราบล่วงหน้าว่าคุณต้องการคอลัมน์บางคอลัมน์เท่านั้นก็มักจะสามารถใช้แผนคิวรีที่มีประสิทธิภาพมากขึ้นโดยการใช้ประโยชน์จากดัชนีที่มีคอลัมน์เหล่านั้นเท่านั้น โชคดีที่มีวิธีการที่จะรู้ล่วงหน้าล่วงหน้าซึ่งคุณสามารถระบุคอลัมน์ที่คุณต้องการในรายการคอลัมน์ได้อย่างชัดเจน แต่เมื่อคุณใช้ "*" คุณกำลังละทิ้งสิ่งนี้เพราะ "มอบทุกอย่างให้ฉันฉันจะเข้าใจว่าฉันต้องการอะไร"
ใช่นอกจากนี้ยังมีการใช้ CPU และหน่วยความจำเพิ่มเติมในการประมวลผลทุกคอลัมน์ แต่เกือบจะเล็กน้อยเมื่อเทียบกับสองสิ่งนี้: ดิสก์พิเศษและแบนด์วิดท์เครือข่ายที่สำคัญที่จำเป็นสำหรับคอลัมน์ที่คุณไม่ต้องการและต้องใช้น้อย แผนแบบสอบถามที่ปรับให้เหมาะสมเพราะจะต้องรวมทุกคอลัมน์
แล้วมีอะไรเปลี่ยนแปลง? โดยพื้นฐานแล้วเครื่องมือเพิ่มประสิทธิภาพ SQL ได้รวมคุณสมบัติที่เรียกว่า "การเพิ่มประสิทธิภาพคอลัมน์" ซึ่งหมายความว่าตอนนี้พวกเขาสามารถค้นหาในคิวรีย่อยระดับล่างถ้าคุณจะใช้คอลัมน์ในระดับบนของแบบสอบถาม
ผลที่สุดของเรื่องนี้คือมันไม่สำคัญอีกต่อไปถ้าคุณใช้ 'SELECT * .. ' ในระดับล่าง / ภายในของแบบสอบถาม สิ่งที่สำคัญจริงๆคือสิ่งที่อยู่ในรายการคอลัมน์ของ SELECT ระดับบนสุด เว้นแต่คุณจะใช้SELECT *..
ในด้านบนแล้วก็อีกครั้งต้องคิดว่าคุณต้องการทั้งหมดของคอลัมน์และอื่น ๆ ไม่สามารถเพิ่มประสิทธิภาพคอลัมน์จ้างได้อย่างมีประสิทธิภาพ
(* - โปรดทราบว่ามีปัญหาการเชื่อมโยงที่แตกต่างกันเล็กน้อยใน Views *
ที่พวกเขาไม่ได้ลงทะเบียนการเปลี่ยนแปลงในรายการคอลัมน์เสมอเมื่อใช้ "*" มีวิธีอื่นในการแก้ไขปัญหานี้และไม่มีผลต่อประสิทธิภาพ)