136 votes

Quelle est la raison de ne pas utiliser select *?

J'ai vu un certain nombre de personnes affirment que vous devriez le nom de chaque colonne que vous voulez dans votre requête select.

En supposant que je vais utiliser toutes les colonnes de toute façon, pourquoi n'aurais-je pas utiliser SELECT *?

Même en tenant compte de la question *requête SQL - Select * from afficher ou Select col1, col2, ... colN de vue*, je ne pense pas que ce soit une copie exacte comme je suis aborder la question dans une perspective légèrement différente.

L'un de nos principes est de ne pas optimiser avant l'heure. Avec cela à l'esprit, il semble que l'aide d' SELECT * devrait être le préféré de la méthode jusqu'à ce qu'il est avéré être un problème de ressources ou le schéma est assez bien défini dans la pierre. Qui, comme nous le savons, ne se produira pas jusqu'à ce que le développement est complètement terminé.

Cela dit, est-il une question primordiale à ne pas utiliser SELECT *?

167voto

Robert Paulson Points 10792

L'essence de la citation de ne pas prématurément l'optimisation est d'aller pour la simple et directe de code et ensuite utiliser un profiler de souligner les points chauds, qui vous permet ensuite d'optimiser son efficacité.

Lorsque vous utilisez select * vous êtes à la rendre impossible le profil, donc vous n'êtes pas à la rédaction claire et simple code et vous allez à l'encontre de l'esprit de la citation. select * est un anti-pattern.


Afin de sélectionner des colonnes n'est pas une optimisation prématurée. Quelques choses du haut de ma tête ....

  1. Si vous spécifiez les colonnes dans une instruction SQL, SQL moteur d'exécution de l'erreur si cette colonne est supprimée de la table et la requête est exécutée.
  2. Vous pouvez analyser plus facilement le code lorsque cette colonne est utilisée.
  3. Vous devriez toujours écrire des requêtes de ramener le moins d'informations.
  4. Comme d'autres mentionnent si vous utilisez ordinal l'accès à la colonne que vous ne devez jamais utiliser select *
  5. Si votre instruction SQL joint des tables, sélectionnez * vous donne toutes les colonnes de toutes les tables de la jointure

Le corollaire est que l'utilisation d' select * ...

  1. Les colonnes utilisées par l'application est opaque
  2. DBA et de leur requête, les profileurs sont pas en mesure d'aider votre application à la mauvaise performance
  3. Le code est plus fragile quand des changements se produisent
  4. Votre base de données et du réseau sont en souffrance parce qu'ils sont de ramener trop de données (I/O)
  5. Moteur de base de données optimisations sont minimes, car vous êtes de ramener toutes les données indépendamment (logique).

L'écriture correcte de SQL est tout aussi simple que la rédaction d' Select *. Donc, la personne paresseuse écrit SQL correcte parce qu'ils ne veulent pas revoir le code et essayer de se rappeler ce qu'ils ont fait quand ils l'ont fait. Ils ne veulent pas expliquer pour le DBA sur tous les bits de code. Ils ne veulent pas expliquer à leurs clients pourquoi l'application s'exécute, comme un chien.

42voto

Bob Points 34449

Si votre code dépend de l'colonnes dans un ordre spécifique, votre code sera briser quand il y a des modifications à la table. Aussi, vous pouvez peut-être aller chercher trop de la table lorsque vous sélectionnez *, surtout si il y a un champ binaire dans le tableau.

Juste parce que vous utilisez toutes les colonnes maintenant, cela ne veut pas dire que quelqu'un d'autre ne va pas ajouter une colonne à la table.

Il ajoute également des frais généraux pour l'exécution du plan de mise en cache, car il doit extraire les méta-données de la table pour savoir ce que les colonnes sont en *.

23voto

ahockley Points 3310

Une des principales raisons en est que si jamais vous ajouter/supprimer des colonnes de votre table, une requête ou à une procédure qui est de faire un SELECT * appel va maintenant avoir plus ou moins de colonnes de données que prévu.

16voto

JohnFx Points 23761

(1) Dans un rond-point façon de rompre la modularité de la règle sur l'utilisation de typage strict dans la mesure du possible. Explicite est presque universellement mieux.

(2) Même si vous avez maintenant besoin de chaque colonne de la table, plus peut être ajouté plus tard, qui sera tiré vers le bas chaque fois que vous exécutez la requête et pourrait nuire à la performance. Il affecte les performances, parce que (A) vous êtes en tirant davantage de données sur le réseau; et (B) Parce que vous peut aller à l'encontre de la capacité de l'optimiseur pour extraire les données à droite de l'index (pour les requêtes sur les colonnes qui font tous partie de l'index.) plutôt que de faire une recherche dans la table elle-même

Quand utiliser select *

Lorsque vous avez explicitement le BESOIN de chaque colonne de la table, par opposition à besoin de chaque colonne de la table QUI EXISTAIENT À L'ÉPOQUE, VOUS avez ÉCRIT LA REQUÊTE. Par exemple, si on écrit une gestion de base de données de l'app que nécessaire pour afficher le contenu entier de la table (ce qu'ils leur est arrivé d'être), vous pouvez utiliser cette approche.

12voto

Powerlord Points 43989

Il ya quelques raisons:

  1. Si le nombre de colonnes dans une base de données de changements et de votre application s'attend à être un certain nombre...
  2. Si l'ordre des colonnes dans une base de données de changements et de votre application attend d'eux d'être dans un certain ordre...
  3. Surcharge de la mémoire. 8 inutiles les colonnes de type ENTIER serait ajouter de 24 octets de mémoire gaspillée. Cela ne ressemble pas beaucoup, mais c'est pour chaque requête ENTIER et est l'un des petits types de colonne... les colonnes supplémentaires sont plus susceptibles d'être de type VARCHAR ou TEXT, ce qui ajoute beaucoup plus rapidement.
  4. La surcharge du réseau. Liées à la surcharge de la mémoire: si j'émets de 30 000 requêtes et ont 8 inutiles les colonnes de type ENTIER, j'ai gâché 960kB de la bande passante. VARCHAR et TEXT sont susceptibles d'être considérablement plus grande.

Note: j'ai choisi un ENTIER dans l'exemple ci-dessus, car ils ont une taille fixe de 4 octets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X