En SQL Server 2012 (o cualquier versión desde 2005), el uso SELECT *...
es solo un posible problema de rendimiento en la instrucción SELECT de nivel superior de una consulta.
Por lo tanto, NO es un problema en Vistas (*), en subconsultas, en cláusulas EXIST, en CTE, ni en SELECT COUNT(*)..
etc., etc. Tenga en cuenta que esto probablemente también sea cierto para Oracle y DB2, y tal vez PostGres (no estoy seguro) , pero es muy probable que todavía sea un problema en muchos casos para MySql.
Para entender por qué (y por qué todavía puede ser un problema en un SELECT de nivel superior), es útil comprender por qué alguna vez fue un problema, ya que el uso SELECT *..
significa " devolver TODAS las columnas ". En general, esto devolverá muchos más datos de los que realmente desea, lo que obviamente puede dar lugar a muchas más E / S, tanto de disco como de red.
Lo que es menos obvio es que esto también restringe los índices y planes de consulta que puede usar un optimizador de SQL, porque sabe que finalmente debe devolver todas las columnas de datos. Si puede saber de antemano que solo desea ciertas columnas, entonces a menudo puede usar planes de consulta más eficientes aprovechando los índices que solo tienen esas columnas. Afortunadamente, hay una manera de saber esto con anticipación, que es para que usted especifique explícitamente las columnas que desea en la lista de columnas. Pero cuando usas "*", estás renunciando a esto a favor de "solo dame todo, descubriré lo que necesito".
Sí, también hay un uso adicional de CPU y memoria para procesar cada columna, pero casi siempre es menor en comparación con estas dos cosas: el disco adicional significativo y el ancho de banda de red requerido para las columnas que no necesita, y tener que usar menos plan de consulta optimizado porque tiene que incluir cada columna.
Entonces, ¿qué cambió? Básicamente, los optimizadores de SQL incorporaron con éxito una característica llamada "Optimización de columna" que solo significa que ahora pueden averiguar en las subconsultas de nivel inferior si alguna vez va a utilizar una columna en los niveles superiores de la consulta.
El resultado de esto es que ya no importa si usa 'SELECCIONAR * ...' en los niveles inferior / interno de una consulta. En cambio, lo que realmente importa es lo que está en la lista de columnas del SELECT de nivel superior. A menos que lo use SELECT *..
en la parte superior, una vez más, debe suponer que desea TODAS las columnas y, por lo tanto, no puede emplear las optimizaciones de columna de manera efectiva.
(* - tenga en cuenta que hay un problema de enlace menor y diferente en las Vistas *
donde no siempre registran el cambio en las listas de columnas cuando se usa "*". Hay otras formas de abordar esto y no afecta el rendimiento).