Je suppose qu'il est possible qu'il y ait des différences subtiles dans leur exécution. J'ai vérifié les plans d'exécution de deux requêtes fonctionnellement équivalentes de ce type dans Oracle 10g :
core> select sta from zip group by sta;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH GROUP BY | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
core> select distinct sta from zip;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH UNIQUE | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
L'opération centrale est légèrement différente : "HASH GROUP BY" contre "HASH UNIQUE", mais les coûts estimés, etc. sont identiques. J'ai ensuite exécuté ces opérations avec le suivi activé et le nombre réel d'opérations était le même pour les deux (sauf que la deuxième opération n'a pas eu à effectuer de lecture physique en raison de la mise en cache).
Mais je pense que parce que les noms des opérations sont différents, l'exécution suivrait des chemins de code quelque peu différents et cela ouvre la possibilité de différences plus significatives.
Je pense que vous devriez préférer la syntaxe DISTINCT à cette fin. Ce n'est pas seulement une habitude, cela indique plus clairement le but de la requête.
20 votes
Il ne s'agit pas d'une question sur les agrégats, mais d'un GROUP BY fonctionnant de la même manière qu'un distinct lorsqu'aucune fonction d'agrégat n'est présente.
2 votes
Vous pouvez également faire
SELECT c FROM myTbl UNION SELECT c FROM myTbl
et obtenir le même résultat... Mais pourquoi compliquer les choses quand SELECT DISTINCT est si facile.0 votes
L'"ordre logique d'exécution" de
GROUP BY
est bien antérieure à "SELECT" etDISTINCT
suit la sélection.0 votes
Une différence très mineure que je n'ai pas vue mentionnée est que
DISTINCT
entraîne la sélection effective du champ, c'est-à-dire que la valeur apparaîtra dans le jeu de résultats.GROUP BY
peut effectivement supprimer les doublons sans sélectionner le champ. Cela n'est pas très pertinent dans la plupart des cas, mais pourrait être exactement ce que vous voulez dans d'autres. Si vous finissez par utiliserGROUP BY
à la place deDISTINCT
un commentaire explicatif dans le code est probablement justifié.0 votes
L'essentiel semble être que, comme la suppression des doublons intervient à différents moments du plan d'exécution, l'une peut être plus efficace que l'autre car la suppression des doublons nécessite un tri ou peut-être l'utilisation de cet index plutôt que de cet autre. Ainsi, il peut y avoir un avantage à supprimer les doublons tôt, ou l'avantage peut venir de l'utilisation d'un index différent tôt et de la consommation d'un tri plus tard, quand il reste peu de lignes et que le tri est négligeable.
1 votes
Sur dba la question mysql-using-distinct-and-group-by-together contient également des réponses utiles.