Compte tenu de votre cahier des charges qui vous sont la sélection de toutes les colonnes, il y a peu de différence à ce moment. Réaliser, cependant, que les schémas de base de données changent. Si vous utilisez SELECT *
vous allez obtenir toute les nouvelles colonnes sont ajoutées à la table, même si, en toute probabilité, votre code n'est pas prêt d'utiliser ou de présenter des nouvelles données. Cela signifie que vous êtes d'exposer votre système à des performances et des fonctionnalités des changements.
Vous pouvez être disposé à rejeter cela comme un moindre coût, mais se rendent compte que les colonnes que vous n'avez pas besoin d'doivent toujours être:
- Lire à partir de la base de données
- Envoyés à travers le réseau
- Organisées dans votre processus
- (pour ADO technologies de type) Enregistrés dans une table de données en mémoire
- Ignorés et rejetés / garbage collector
L'élément n ° 1 a de nombreux coûts cachés, y compris l'élimination d'un certain potentiel index de couverture, causant de données chargement de la page (et le serveur cache raclée), encourir ligne / page / table des verrous qui pourrait en être autrement à éviter.
Bilan de ce contre, le potentiel d'économie de spécifier les colonnes contre une *
, et le seul potentiel d'économies:
- Programmeur n'a pas besoin de revoir le SQL pour ajouter des colonnes
- Le réseau de transport de la SQL est plus petit, plus rapide
- SQL Server query analyser / moment de la validation
- SQL Server query cache de plan
Pour le point 1, la réalité est que vous allez à ajouter / modifier le code pour utiliser une nouvelle colonne, vous pouvez ajouter de toute façon, donc c'est un lavage.
Pour le point 2, la différence est rarement suffisante pour vous pousser dans un autre paquet de taille ou de nombre de paquets réseau. Si vous arrivez à un point où l'instruction SQL de temps de transmission est le principal problème, vous avez probablement besoin de réduire le taux de déclarations d'abord.
Pour le point 3, il n'y a PAS d'épargne que l'expansion de l' *
a lieu de toute façon, ce qui signifie que la consultation de la table(s) schéma de toute façon. De façon réaliste, qui liste les colonnes seront facturés au même prix, car ils doivent être validés par rapport au schéma. En d'autres termes c'est un système complet de lavage.
Pour le point 4, lorsque vous spécifiez les colonnes spécifiques, votre plan de requête cache pourrait obtenir plus grand, mais seulement si vous êtes aux prises avec différents ensembles de colonnes (ce qui n'est pas ce que vous avez spécifiée). Dans ce cas, vous ne voulez entrées de cache différent parce que vous souhaitez que les différents plans au besoin.
Donc, tout cela se résume, en raison de la manière que vous avez spécifié à la question, à la question de la résilience face à d'éventuelles modifications du schéma. Si vous êtes à la gravure de ce schéma dans la mémoire ROM (ça arrive), puis un *
est parfaitement acceptable.
Cependant, ma ligne de conduite générale est que vous devez sélectionner uniquement les colonnes dont vous avez besoin, ce qui signifie que parfois, il va ressembler à vous demandons à tous d'entre eux, mais les Administrateurs de bases de données et le schéma de l'évolution, certaines nouvelles colonnes peuvent apparaître qui pourrait grandement affecter la requête.
Mon conseil est que vous devez TOUJOURS SÉLECTIONNER des colonnes spécifiques. Rappelez-vous que vous le faites bien ce que vous faites, donc il suffit de prendre l'habitude de faire.
Si vous vous demandez pourquoi un schéma peut changer sans changer le code, penser en termes de journal d'audit efficace/les dates d'expiration et d'autres choses semblables qui sont ajoutés par les Administrateurs de bases de données par voie systémique pour des questions de conformité. Une autre source de sournoises des changements est denormalizations pour la performance ailleurs dans le système ou de champs définis par l'utilisateur.