Compte tenu de votre cahier des charges que vous êtes sélectionnez toutes les colonnes, il y a peu de différence à ce moment . Sachez cependant que les schémas de base de données changent. Si vous utilisez, SELECT *
vous allez ajouter de nouvelles colonnes à la table, même si selon toute vraisemblance, votre code n'est pas prêt à utiliser ou à présenter ces nouvelles données. Cela signifie que vous exposez votre système à des changements de performances et de fonctionnalités inattendus.
Vous voudrez peut-être rejeter cela comme un coût mineur, mais sachez que les colonnes dont vous n'avez pas besoin doivent toujours être:
- Lire à partir de la base de données
- Envoyé sur le réseau
- Marshalled dans votre processus
- (pour les technologies de type ADO) Enregistré dans une table de données en mémoire
- Ignoré et mis au rebut / ramassé
L'élément n ° 1 a de nombreux coûts cachés, y compris l'élimination de certains index de couverture potentiels, provoquant des chargements de pages de données (et la destruction du cache du serveur), entraînant des verrous de ligne / page / table qui pourraient être évités autrement.
Comparez cela aux économies potentielles de la spécification des colonnes par rapport à an *
et les seules économies potentielles sont:
- Le programmeur n'a pas besoin de revoir le SQL pour ajouter des colonnes
- Le transport réseau du SQL est plus petit / plus rapide
- Heure d'analyse / de validation des requêtes SQL Server
- Cache du plan de requête SQL Server
Pour l'élément 1, la réalité est que vous allez ajouter / modifier du code pour utiliser toute nouvelle colonne que vous pourriez ajouter de toute façon, donc c'est un lavage.
Pour l'élément 2, la différence est rarement suffisante pour vous pousser dans une taille de paquet ou un nombre de paquets réseau différents. Si vous arrivez au point où le temps de transmission des instructions SQL est le problème prédominant, vous devez probablement d'abord réduire le taux d'instructions.
Pour l'élément 3, il n'y a AUCUNE économie car l'expansion du *
doit se produire de toute façon, ce qui signifie de toute façon consulter le schéma des tables. De manière réaliste, la liste des colonnes entraînera le même coût car elles doivent être validées par rapport au schéma. En d'autres termes, c'est un lavage complet.
Pour l'élément 4, lorsque vous spécifiez des colonnes spécifiques, le cache de votre plan de requête peut devenir plus volumineux, mais uniquement si vous avez affaire à différents ensembles de colonnes (ce qui n'est pas ce que vous avez spécifié). Dans ce cas, vous voulez des entrées de cache différentes car vous voulez des plans différents selon vos besoins.
Donc, tout cela se résume, en raison de la façon dont vous avez spécifié la question, au problème de résilience face à d'éventuelles modifications de schéma. Si vous gravez ce schéma dans la ROM (cela arrive), alors un *
est parfaitement acceptable.
Cependant, ma directive générale est que vous ne devez sélectionner que les colonnes dont vous avez besoin, ce qui signifie que parfois il semblera que vous les demandiez toutes, mais les DBA et l'évolution du schéma signifient que de nouvelles colonnes peuvent apparaître, ce qui pourrait grandement affecter la requête. .
Mon conseil est que vous devez TOUJOURS CHOISIR des colonnes spécifiques . N'oubliez pas que vous devenez bon dans ce que vous faites encore et encore, alors prenez l'habitude de le faire correctement.
Si vous vous demandez pourquoi un schéma peut changer sans changement de code, pensez à la journalisation d'audit, aux dates d'effet / d'expiration et à d'autres éléments similaires qui sont ajoutés par les administrateurs de base de données pour des problèmes de conformité systématiques. Une autre source de changements sournois est la dénormalisation des performances ailleurs dans le système ou dans les champs définis par l'utilisateur.