Untuk menjawab pertanyaan Anda, perlu diurai sedikit:
SELECT *
memiliki 3 jenis kelemahan utama:
- Pemeliharaan kode:menggunakan SELECT * mengurangi keterbacaan untuk tabel/kueri yang kompleks, dan dapat menyebabkan masalah saat aplikasi klien mengharapkan hasil tertentu dari kueri, tetapi tabel berubah
- Kinerja jaringan:menggunakan SELECT * saat mengembalikan hasil ke aplikasi klien berarti semua kolom akan dikembalikan ke klien; jika hanya beberapa kolom tersebut yang digunakan oleh klien, maka bandwidth akan terbuang percuma dan aplikasi berjalan lebih lambat dari yang seharusnya.
- Kinerja pengindeksan / rencana kueri:Dalam beberapa keadaan, jika Anda memiliki kueri yang benar-benar hanya perlu mengembalikan kolom yang berpartisipasi dalam indeks, tetapi Anda mengembalikan semuanya sebagai gantinya, maka Anda bisa mendapatkan rencana kueri yang jauh lebih buruk yang dibuat oleh mesin.
Saya tidak yakin apa yang Anda maksud dengan "implikasi mengenai interpretasi wildcard", tetapi saya menduga Anda salah paham mengapa SELECT * adalah ide yang buruk - mesin SQL tetap memvalidasi kolom yang disediakan; biaya "memperluas" wildcard pada dasarnya adalah 0.
Prosedur tersimpan sebenarnya bukan "unit kode yang dikompilasi":rencana kueri untuk prosedur tersimpan biasanya akan di-cache setelah pertama kali dijalankan, tetapi hal yang sama sebenarnya berlaku untuk pernyataan SQL ad-hoc juga dalam banyak/kebanyakan keadaan.
Sekarang, untuk benar-benar menjawab pertanyaan Anda:Ya , kerugian menggunakan SELECT *
di SQL ad-hoc juga berlaku, sama, untuk SQL di dalam prosedur tersimpan.