Dalam SQL Server 2012, (atau versi apa pun dari 2005 ke atas), menggunakan SELECT *...
hanya masalah kinerja yang mungkin dalam pernyataan SELECT tingkat atas dari kueri.
Jadi BUKAN masalah di Views (*), di subqueries, di klausa ADA, di CTE, atau di SELECT COUNT(*)..
dll, dll. Perhatikan, bahwa ini mungkin juga berlaku untuk Oracle, dan DB2, dan mungkin PostGres (tidak yakin) , tetapi sangat mungkin bahwa itu masih menjadi masalah dalam banyak kasus untuk MySql.
Untuk memahami mengapa (dan mengapa itu masih bisa menjadi masalah dalam SELECT tingkat atas), akan sangat membantu untuk memahami mengapa itu pernah menjadi masalah, yang karena menggunakan SELECT *..
cara " mengembalikan SEMUA kolom ". Secara umum ini akan mengembalikan lebih banyak data daripada yang Anda inginkan, yang jelas dapat menghasilkan lebih banyak IO, baik disk maupun jaringan.
Apa yang kurang jelas adalah bahwa ini juga membatasi indeks apa dan rencana kueri yang dapat digunakan oleh pengoptimal SQL, karena ia tahu bahwa pada akhirnya harus mengembalikan semua kolom data. Jika sebelumnya dapat mengetahui bahwa Anda hanya menginginkan kolom tertentu, maka seringkali dapat menggunakan rencana kueri yang lebih efisien dengan memanfaatkan indeks yang hanya memiliki kolom tersebut. Untungnya ada cara untuk mengetahui hal ini sebelumnya, yaitu bagi Anda untuk secara eksplisit menentukan kolom yang Anda inginkan dalam daftar kolom. Tetapi ketika Anda menggunakan "*", Anda menolak ini demi "berikan saja segalanya kepada saya, saya akan mencari tahu apa yang saya butuhkan."
Ya, ada juga CPU tambahan dan penggunaan memori untuk memproses setiap kolom, tetapi hampir selalu kecil dibandingkan dengan dua hal ini: disk tambahan yang signifikan dan bandwidth jaringan yang diperlukan untuk kolom yang tidak Anda butuhkan, dan harus menggunakan lebih sedikit rencana kueri yang dioptimalkan karena harus menyertakan setiap kolom.
Jadi apa yang berubah? Pada dasarnya, Pengoptimal SQL berhasil memasukkan fitur yang disebut "Optimasi Kolom" yang hanya berarti, bahwa mereka sekarang dapat mencari tahu di sub-kueri tingkat lebih rendah jika Anda akan benar-benar menggunakan kolom di tingkat atas permintaan.
Hasilnya adalah tidak masalah lagi jika Anda menggunakan 'SELECT * ..' di tingkat bawah / dalam dari sebuah kueri. Alih-alih, yang sebenarnya penting adalah apa yang ada dalam daftar kolom SELECT tingkat atas. Kecuali Anda menggunakan SELECT *..
di bagian atas, maka sekali lagi, harus mengasumsikan bahwa Anda ingin SEMUA kolom, dan karenanya tidak dapat menggunakan optimasi kolom secara efektif.
(* - perhatikan bahwa ada masalah kecil yang mengikat di Tampilan dengan di *
mana mereka tidak selalu mendaftarkan perubahan dalam daftar kolom ketika "*" digunakan. Ada cara lain untuk mengatasinya dan itu tidak mempengaruhi kinerja.)