Dans SQL Server 2012 (ou toute version à partir de 2005), l'utilisation SELECT *...
n'est qu'un problème de performances possible dans l'instruction SELECT de niveau supérieur d'une requête.
Donc, ce n'est PAS un problème dans Views (*), dans les sous-requêtes, dans les clauses EXIST, dans les CTE, ni dans SELECT COUNT(*)..
etc., etc. Notez que cela est probablement également vrai pour Oracle, DB2 et peut - être PostGres (pas sûr) , mais il est très probable que cela reste un problème dans beaucoup de cas pour MySql.
Pour comprendre pourquoi (et pourquoi cela peut toujours être un problème dans un SELECT de niveau supérieur), il est utile de comprendre pourquoi il en a déjà été un, car son utilisation SELECT *..
signifie " renvoyer TOUTES les colonnes ". En général, cela renvoie beaucoup plus de données que vous ne le souhaitez vraiment, ce qui peut évidemment entraîner beaucoup plus d'E / S, à la fois sur disque et sur le réseau.
Ce qui est moins évident, c'est que cela limite également les index et les plans de requête qu'un optimiseur SQL peut utiliser, car il sait qu'il doit finalement renvoyer toutes les colonnes de données. S'il peut savoir à l'avance que vous ne voulez que certaines colonnes, il peut souvent utiliser des plans de requête plus efficaces en exploitant les index contenant uniquement ces colonnes. Heureusement, il existe un moyen de le savoir à l'avance, c'est-à-dire de spécifier explicitement les colonnes souhaitées dans la liste. Mais lorsque vous utilisez "*", vous renoncez à "tout donner, je vais trouver ce dont j'ai besoin".
Oui, chaque colonne nécessite également une utilisation accrue de la CPU et de la mémoire, mais elle est presque toujours mineure comparée à ces deux choses: la bande passante supplémentaire importante nécessaire pour le disque et la bande passante réseau requise pour les colonnes inutiles plan de requête optimisé car il doit inclure chaque colonne.
Alors qu'est-ce qui a changé? Fondamentalement, les optimiseurs SQL ont intégré avec succès une fonctionnalité appelée "Optimisation de colonne", ce qui signifie simplement qu'ils peuvent désormais déterminer dans les sous-requêtes de niveau inférieur si vous envisagez d'utiliser une colonne dans les niveaux supérieurs de la requête.
Le résultat de ceci est que cela n'a plus d'importance si vous utilisez 'SELECT * ..' dans les niveaux inférieurs / internes d'une requête. Au lieu de cela, ce qui compte vraiment, c’est ce qui est dans la liste des colonnes du SELECT de niveau supérieur. À moins que vous n'utilisiez SELECT *..
dans le haut, alors encore une fois, il faut supposer que vous voulez TOUTES les colonnes et que vous ne pouvez donc pas utiliser efficacement les optimisations de colonne.
(* - Notez qu'il existe un problème de liaison mineur et différent dans les vues, *
où elles n'enregistrent pas toujours les modifications dans les listes de colonnes lorsque "*" est utilisé. Il existe d'autres moyens de résoudre ce problème sans que cela affecte les performances.)