Le caractère astérisque, "*", dans l'instruction SELECT est une abréviation pour toutes les colonnes de la ou des tables concernées par la requête.
Performance
En *
La sténographie peut être plus lente parce que
- Tous les champs ne sont pas indexés, ce qui oblige à effectuer un balayage complet de la table, moins efficace.
- Ce que vous sauvegardez pour l'envoyer
SELECT *
sur le fil risque un balayage complet de la table
- Renvoyer plus de données que nécessaire
- Le renvoi des colonnes suivantes à l'aide d'un type de données de longueur variable peut entraîner une surcharge de recherche.
Maintenance
Lors de l'utilisation de SELECT *
:
- Une personne ne connaissant pas la base de code serait obligée de consulter la documentation pour savoir quelles colonnes sont renvoyées avant d'être en mesure d'effectuer des changements compétents. Rendre le code plus lisible, minimiser l'ambiguïté et le travail nécessaire pour les personnes qui ne connaissent pas le code permet d'économiser du temps et des efforts à long terme.
- Si le code dépend de l'ordre des colonnes,
SELECT *
cachera une erreur qui risque de se produire si l'ordre des colonnes d'une table a été modifié.
- Même si vous avez besoin de toutes les colonnes au moment où la requête est rédigée, ce ne sera peut-être plus le cas à l'avenir
- l'utilisation complique le profilage
Conception
SELECT *
est un anti-modèle :
- L'objectif de la requête est moins évident ; les colonnes utilisées par l'application sont opaques.
- Il enfreint la règle de modularité qui veut que l'on utilise un typage strict chaque fois que possible. Le typage explicite est presque universellement meilleur.
Quand faut-il utiliser "SELECT *" ? doit-il être utilisé ?
Il est acceptable d'utiliser SELECT *
lorsqu'il y a un besoin explicite de toutes les colonnes des tables concernées, par opposition à toutes les colonnes qui existaient au moment où la requête a été écrite. La base de données développera en interne le * dans la liste complète des colonnes - il n'y a pas de différence de performance.
Sinon, il faut énumérer explicitement chaque colonne à utiliser dans la requête - de préférence en utilisant un alias de table.
33 votes
SELECT COUNT(*)
être mauvais, c'est incroyablement vieux et dépassé . Pour plus d'informations surSELECT *
- voir : stackoverflow.com/questions/1960036/9 votes
SELECT COUNT(*)
donne une réponse différente de celle deSELECT COUNT(SomeColumn)
sauf si la colonne est une colonne NOT NULL. Et l'optimiseur peut donnerSELECT COUNT(*)
traitement spécial - et c'est généralement le cas. Il convient également de noter queWHERE EXISTS(SELECT * FROM SomeTable WHERE ...)
fait l'objet d'un traitement particulier.0 votes
Duplication possible de L'utilisation de select * peut-elle être justifiée ?
3 votes
@Michael Mrozek, en fait c'est l'inverse de la question. Je demande si cela a déjà été nocif, et non pas si cela n'a jamais été nocif.
0 votes
Sur quelles bases de données relationnelles/sql
SELECT COUNT(*)
n'est PAS un problème de performance ?0 votes
Tous, si vous l'utilisez correctement.
1 votes
@Bytecode Ninja : spécifiquement, MySQL avec le moteur MyISAM a une optimisation pour COUNT(*) : mysqlperformanceblog.com/2007/04/10/count-vs-countcol
0 votes
@Dave : Je suppose que la question de l'OP se réfère à un select count( ) sans clause where ("Je comprends que SELECT COUNT( ) est un problème de performance sur certaines bases de données"), et sur la plupart des bases de données, select count(*) nécessite un balayage de toute la table. La question est de savoir sur quelles bases de données il n'est pas nécessaire d'effectuer un balayage complet de la table. Apparemment, MySQL/MyISAM est l'une d'entre elles...
0 votes
Je ne supposais pas qu'il n'y avait pas de clause WHERE. C'est là la grande différence. En outre, du moins sur SQL Server, vous constaterez probablement qu'un simple SELECT COUNT(*) ne parcourt que le plus petit index de la table pour récupérer le nombre de lignes, et pas nécessairement l'index en grappe ou le tas sous-jacent qui représente la table.
1 votes
Pour SQL Server, voir sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/
0 votes
Également en rapport (éventuellement en double) : stackoverflow.com/questions/321299