No SQL Server 2012 (ou qualquer versão a partir de 2005), o uso SELECT *...
é apenas um possível problema de desempenho na instrução SELECT de nível superior de uma consulta.
Portanto, NÃO é um problema nas Views (*), nas subconsultas, nas cláusulas EXIST, nas CTEs, nem nas SELECT COUNT(*)..
etc., etc. Observe que isso provavelmente também é verdade para Oracle e DB2, e talvez PostGres (não tenho certeza) , mas é muito provável que ainda seja um problema em muitos casos para o MySql.
Para entender o porquê (e por que ainda pode ser um problema em um SELECT de nível superior), é útil entender por que houve um problema, porque usar SELECT *..
significa significa " retornar TODAS as colunas ". Em geral, isso retornará muito mais dados do que você realmente deseja, o que obviamente pode resultar em muito mais IO, tanto em disco quanto em rede.
O que é menos óbvio é que isso também restringe os índices e planos de consulta que um otimizador de SQL pode usar, porque sabe que, em última análise, deve retornar todas as colunas de dados. Se você souber antecipadamente que deseja apenas determinadas colunas, geralmente poderá usar planos de consulta mais eficientes aproveitando os índices que possuem apenas essas colunas. Felizmente, existe uma maneira de saber isso com antecedência, que é para você especificar explicitamente as colunas que deseja na lista de colunas. Mas quando você usa "*", está renunciando a isso em favor de "apenas me dê tudo, vou descobrir o que preciso".
Sim, também há uso adicional de CPU e memória para processar todas as colunas, mas é quase sempre menor em comparação com essas duas coisas: a significativa largura de banda extra de disco e rede necessária para as colunas que você não precisa, e ter que usar menos plano de consulta otimizado porque precisa incluir todas as colunas.
Então o que mudou? Basicamente, os Otimizadores de SQL incorporaram com êxito um recurso chamado "Otimização de Colunas", o que significa apenas que agora eles podem descobrir nas subconsultas de nível inferior se você realmente usará uma coluna nos níveis superiores da consulta.
O resultado disso é que não importa mais se você usar 'SELECT * ..' nos níveis inferior / interno de uma consulta. Em vez disso, o que realmente importa é o que está na lista de colunas do SELECT de nível superior. A menos que você use SELECT *..
na parte superior, ela deve assumir novamente que você deseja TODAS as colunas e, portanto, não pode empregar otimizações de coluna efetivamente.
(* - observe que há um problema de ligação menor e diferente no Views, *
onde eles nem sempre registram as alterações nas listas de colunas quando "*" é usado. Existem outras maneiras de resolver isso e isso não afeta o desempenho.)