Si bien escribir instrucciones SELECT * FROM es una práctica muy común, nunca se recomienda usar por varias razones:
Pueden fallas aplicaciones por cambio en el orden de campos en el SELECT
A pesar de que es una práctica cómoda, puede provocar que en el futuro una aplicación no funcione correctamente. Suponiendo que existe una tabla «empleados» con los campos
- Clave
- Nombre
- Direccion
Si se ejecuta un
SELECT * FROM empleados
Entonces la respuesta traerá 3 campos (Clave, Nombre, Direccion, en ese orden).
Si después se modifica la estructura de la tabla y se añade el campo Apellidos después de Nombre (quedando campos Clave, Nombre, Apellidos y luego Direccion), el mismo SELECT «recorrerá» el campo Direccion un lugar.
Si un programa usa los campos por posición y despliega el campo 3, por ejemplo, entonces se estaría utilizando el campo Apellidos, en lugar de Direccion, como en la primera tabla (antes de añadir el campo).
La lectura puede ser más lenta
Si se tiene una tabla con, por poner un ejemplo, 40 campos (que no es raro) y solo se necesitan -en un momento específico- 3 de ellos, entonces un SELECT * (que extraerá 30 campos del disco) se tardará más que aquel que tiene solo 3 campos, por ejemplo
SELECT campo1, campo2, campo3 FROM tabla;
En el caso de los índices puede ser incluso beneficioso si todos los campos que se necesita extraer están en la llave del índice: Si se ejecuta un SELECT de 2 campos, y esos dos campos están en un índice, entonces solo leyendo el índice se puede responder todo el SELECT; por el contrario, si se ejecuta un SELECT * entonces el motor de bases de datos tendrá que -quizá- usar el índice y luego hacer el «salto» al disco para extraer el resto de los datos (en SQL Server se llaman lookups cuando se revisa el plan de ejecución en el SSMS).
SQL Server, específicamente, puede hacer uso de unos índices CLUSTER que incluso pueden ayudar aún más a que una consulta -que no tiene un SELECT *- pueda ser más eficiente, pero sería materia de otro artículo. Otro tipo de índice que se puede aprovechar es el índice con campos incluidos.