In SQL Server 2012 (o qualsiasi versione dal 2005 in poi) l'utilizzo SELECT *...
è solo un possibile problema di prestazioni nell'istruzione SELECT di livello superiore di una query.
Quindi NON è un problema in Views (*), nelle sottoquery, nelle clausole EXIST, nei CTE, né in SELECT COUNT(*)..
ecc. Ecc. Si noti che questo è probabilmente vero anche per Oracle, DB2 e forse PostGres (non sono sicuro) , ma è molto probabile che sia ancora un problema in molti casi per MySql.
Per capire perché (e perché può ancora essere un problema in un SELECT di primo livello), è utile capire perché è mai stato un problema, perché usare SELECT *..
significa " restituire TUTTE le colonne ". In generale, ciò restituirà molti più dati di quanto si desideri, il che ovviamente può comportare molti più IO, sia su disco che in rete.
Ciò che è meno ovvio è che ciò limita anche gli indici e i piani di query che un ottimizzatore SQL può utilizzare, poiché sa che alla fine deve restituire tutte le colonne di dati. Se è in grado di sapere in anticipo che si desidera solo determinate colonne, spesso è possibile utilizzare piani di query più efficienti sfruttando gli indici che hanno solo quelle colonne. Fortunatamente c'è un modo per saperlo in anticipo, che è per te specificare esplicitamente le colonne che desideri nell'elenco delle colonne. Ma quando usi "*", lo stai perdendo a favore di "dammi tutto, capirò di cosa ho bisogno".
Sì, c'è anche un ulteriore utilizzo di CPU e memoria per l'elaborazione di ogni colonna, ma è quasi sempre minore rispetto a queste due cose: la notevole larghezza di banda aggiuntiva del disco e della rete richiesta per le colonne che non ti servono e devi usare un piano di query ottimizzato perché deve includere ogni colonna.
Quindi cosa è cambiato? Fondamentalmente, gli Ottimizzatori SQL hanno incorporato con successo una funzione chiamata "Ottimizzazione delle colonne" che significa semplicemente che ora possono capire nelle sottoquery di livello inferiore se si intende effettivamente utilizzare una colonna nei livelli superiori della query.
Il risultato è che non importa più se si utilizza 'SELECT * ..' nei livelli inferiore / interno di una query. Invece, ciò che conta davvero è ciò che è nell'elenco delle colonne del SELECT di primo livello. A meno che non lo utilizzi SELECT *..
nella parte superiore, quindi, ancora una volta, devi presumere che desideri TUTTE le colonne e quindi non puoi utilizzare le ottimizzazioni delle colonne in modo efficace.
(* - si noti che esiste un problema di rilegatura minore diverso in Views con il *
quale non registrano sempre la modifica negli elenchi di colonne quando si utilizza "*". Esistono altri modi per risolvere questo problema e ciò non influisce sulle prestazioni.)