12
votes

Pourquoi ne devriez-vous pas utiliser distinct lorsque vous pourriez utiliser le groupe?

Selon Conseils de MySQL Performance Wiki:

Ne pas utiliser distinct lorsque vous avez ou pourriez utiliser le groupe par.

Quelqu'un peut-il poster des exemples de requêtes où le groupe par peut être utilisé au lieu de distinct?


0 commentaires

4 Réponses :


1
votes
SELECT DISTINCT Code
FROM YourTable

1 commentaires

Comment est-ce une réponse à la Q? Est-ce que je manque quelque chose?



8
votes

Si vous savez que deux colonnes de votre résultat sont toujours directement liées, il est plus lent de le faire:

SELECT CustomerId, CustomerName FROM (...) GROUP BY CustomerId


6 commentaires

Ces deux requêtes ne sont pas les mêmes, n'est-ce pas? Dans la seconde, vous ne sélectionnez que des identifiants distincts, pas aussi des noms distincts.


Cela ne fonctionnera pas avec aucun autre T-SQL, ou cela ne sera pas plus rapide avec d'autre?


Bien le second ne fonctionne pas !!! Toute colonne non incluse dans le groupe par clause nécessite une fonction d'agrégation.


Craig Young: vraiment? dev.mysql.com/doc/refman/ 5.0 / FR / GROUP-BIDDEND-COLONNES.HTML "MySQL étend l'utilisation de groupe par afin que vous puissiez utiliser des colonnes ou des calculs non gré dans la liste de sélection qui n'apparaissent pas dans la clause du groupe par la clause." Quelle version de mysql utilisez-vous? Peut-être que vous avez éteint cette fonctionnalité? "Cette extension ne s'applique pas si le mode_full_group_by SQL est activé."


@Mark: permet de supposer que vous avez les données suivantes pour col1, COL2 nongr. {1, premier} {1, seconde}; Si vous SELECT SELECT COL1, COL2 de (...) Group par COL1 - Laquelle des 2 valeurs non assemblées possibles doit être sélectionnée dans Col2? La requête est ambiguë et, en tant que telle, jamais sera autorisée à fonctionner.


@CRAGYOUNG: Je pense que le point clé est «directement associé», ce qui signifie que cela ne fonctionne que de manière fiable lorsqu'il existe une dépendance fonctionnelle CustomerDe Nom de Customernie, alors que votre exemple par définition ne dispose pas de la dépendance fonctionnelle équivalente. En l'absence de dépendance fonctionnelle, vous êtes correct. Afaict MySQL ne s'en soucie pas réellement (ou sache?) Si la dépendance fonctionnelle existe; Cela suppose simplement que cela fait et tire des valeurs correspondantes pour une colonne de regroupement donnée «au hasard».



0
votes

La règle de base: mettez toutes les colonnes de la clause SELECT dans le groupe par clause

de sorte xxx

devient xxx


1 commentaires

Corrige moi si je me trompe. La règle de base ne devrait-elle pas être, mettre toutes les colonnes non agrégées de la clause Select dans le groupe par clause?



-2
votes

Exemple.

Relation Client (SSNUM, NOM, PIXCODE, Adresse) PK (SSNUM). SSNUM est un numéro de sécurité sociale. P>

SQL: P>

 Select DISTINCT ssnum from customer where zipcode=1234 group by name


1 commentaires

Quelle est la différence de réponse lorsque vous avez du groupe et aucun groupe par? Quelle est la différence de réponse lorsque vous avez des distincts et non distincts (est-ce «indistinct»?)? AFAICS, les requêtes produiraient tous le même ensemble de résultats (donner ou prendre la commande, ce qui ne compte pas), mais pas nécessairement tout à la même vitesse.