Dada su especificación de que está seleccionando todas las columnas, hay poca diferencia en este momento . Sin embargo, tenga en cuenta que los esquemas de la base de datos cambian. Si usa SELECT *
, obtendrá columnas nuevas agregadas a la tabla, aunque con toda probabilidad, su código no está preparado para usar o presentar esos nuevos datos. Esto significa que está exponiendo su sistema a cambios inesperados de rendimiento y funcionalidad.
Puede estar dispuesto a descartar esto como un costo menor, pero tenga en cuenta que las columnas que no necesita aún deben ser:
- Leer de la base de datos
- Enviado a través de la red
- Marcado en su proceso
- (para tecnologías de tipo ADO) Guardado en una tabla de datos en memoria
- Ignorado y descartado / recolección de basura
El elemento n. ° 1 tiene muchos costos ocultos, incluida la eliminación de algunos índices de cobertura potenciales, lo que causa cargas de páginas de datos (y agitación de la memoria caché del servidor), incurriendo en bloqueos de fila / página / tabla que de otro modo podrían evitarse.
Equilibre esto con los ahorros potenciales de especificar las columnas versus an *
y los únicos ahorros potenciales son:
- El programador no necesita volver a visitar el SQL para agregar columnas
- El transporte de red del SQL es más pequeño / más rápido
- Tiempo de análisis / validación de consultas de SQL Server
- Caché del plan de consulta de SQL Server
Para el elemento 1, la realidad es que va a agregar / cambiar el código para usar cualquier columna nueva que pueda agregar de todos modos, por lo que es un lavado.
Para el elemento 2, la diferencia rara vez es suficiente para empujarlo a un tamaño de paquete diferente o un número de paquetes de red. Si llega al punto donde el tiempo de transmisión de la declaración SQL es el problema predominante, es probable que primero necesite reducir la velocidad de las declaraciones.
Para el ítem 3, NO hay ahorros ya que la expansión del *
tiene que ocurrir de todos modos, lo que significa consultar el esquema de la (s) tabla (s) de todos modos. Siendo realistas, enumerar las columnas incurrirá en el mismo costo porque deben validarse contra el esquema. En otras palabras, este es un lavado completo.
Para el elemento 4, cuando especifica columnas específicas, la memoria caché del plan de consulta podría aumentar, pero solo si se trata de diferentes conjuntos de columnas (que no es lo que ha especificado). En este caso, desea entradas de caché diferentes porque desea planes diferentes según sea necesario.
Entonces, todo se reduce, debido a la forma en que especificó la pregunta, al problema de la resistencia ante eventuales modificaciones del esquema. Si está grabando este esquema en ROM (sucede), entonces *
es perfectamente aceptable.
Sin embargo, mi pauta general es que solo debe seleccionar las columnas que necesita, lo que significa que a veces parecerá que las está pidiendo todas, pero los DBA y la evolución del esquema significan que pueden aparecer algunas columnas nuevas que podrían afectar en gran medida la consulta .
Mi consejo es que SIEMPRE SELECCIONE columnas específicas . Recuerda que te vuelves bueno en lo que haces una y otra vez, así que solo tienes la costumbre de hacerlo bien.
Si se pregunta por qué un esquema podría cambiar sin cambiar el código, piense en términos de registro de auditoría, fechas de vigencia / caducidad y otras cosas similares que los DBA agregan para problemas de cumplimiento sistemáticamente. Otra fuente de cambios disimulados son las desnormalizaciones para el rendimiento en otras partes del sistema o campos definidos por el usuario.