Si j'ai une table
CREATE TABLE users (
id int(10) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
profession varchar(255) NOT NULL,
employer varchar(255) NOT NULL,
PRIMARY KEY (id)
)
et je veux obtenir toutes les valeurs uniques de profession
champ, ce qui serait plus rapide (ou recommandé):
SELECT DISTINCT u.profession FROM users u
ou
SELECT u.profession FROM users u GROUP BY u.profession
?
Réponses:
Ils sont essentiellement équivalents les uns aux autres (en fait, c'est ainsi que certaines bases de données sont implémentées
DISTINCT
sous le capot).Si l'un d'eux est plus rapide, ce sera le cas
DISTINCT
. En effet, bien que les deux soient les mêmes, un optimiseur de requête devrait détecter le fait que vousGROUP BY
ne tirez parti d'aucun membre du groupe, uniquement de ses clés.DISTINCT
rend cela explicite, vous pouvez donc vous en tirer avec un optimiseur légèrement plus stupide.En cas de doute, testez!
la source
DISTINCT
etGROUP BY
diffèrent en ce sensDISTINCT
n'a pas à trier la sortie, etGROUP BY
par défaut le fait. Cependant, dans MySQL, même unDISTINCT
+ORDER BY
peut toujours être plus rapide qu'un enGROUP BY
raison des conseils supplémentaires pour l'optimiseur, comme expliqué par SquareCog.Si vous avez un index sur
profession
, ces deux sont des synonymes.Si ce n'est pas le cas, utilisez
DISTINCT
.GROUP BY
enMySQL
sortes résultats. Vous pouvez même faire:et obtenez vos professions triées dans l'
DESC
ordre.DISTINCT
crée une table temporaire et l'utilise pour stocker les doublons.GROUP BY
fait de même, mais trie les résultats distincts par la suite.Alors
est plus rapide, si vous n'avez pas d'index sur
profession
.la source
ORDER BY NULL
àGROUP BY
pour éviter le tri.Toutes les réponses ci-dessus sont correctes, pour le cas de DISTINCT sur une seule colonne vs GROUPE BY sur une seule colonne. Chaque moteur db a sa propre implémentation et optimisations, et si vous vous souciez de la très petite différence (dans la plupart des cas), alors vous devez tester contre un serveur spécifique ET une version spécifique! Comme les implémentations peuvent changer ...
MAIS, si vous sélectionnez plus d'une colonne dans la requête, le DISTINCT est essentiellement différent! Parce que dans ce cas, il comparera TOUTES les colonnes de toutes les lignes, au lieu d'une seule colonne.
Donc, si vous avez quelque chose comme:
C'est une erreur courante de penser que le mot-clé DISTINCT distingue les lignes par la première colonne que vous avez spécifiée, mais le DISTINCT est un mot-clé général de cette manière.
Donc, les gens, vous devez faire attention à ne pas considérer les réponses ci-dessus comme correctes dans tous les cas ... Vous pourriez être confus et obtenir de mauvais résultats alors que tout ce que vous vouliez était d'optimiser!
la source
Optez pour le plus simple et le plus court si vous le pouvez - DISTINCT semble être plus ce que vous recherchez uniquement parce qu'il vous donnera EXACTEMENT la réponse dont vous avez besoin et seulement cela!
la source
Grouper coûte cher que Distinct puisque Group by fait un tri sur le résultat tandis que distinct l'évite. Mais si vous voulez que group by donne le même résultat que distinct, donnez l' ordre par null .
est égal à
la source
SELECT profession FROM users GROUP BY profession
bien distinct peut être plus lent que grouper à certaines occasions dans les postgres (ne sais pas pour les autres dbs).
exemple testé:
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
donc sois prudent ... :)
la source
Il semble que les requêtes ne soient pas exactement les mêmes. Au moins pour MySQL.
Comparer:
La deuxième requête donne en outre "Utilisation de filesort" dans Extra.
la source
ORDER BY NULL
à laGROUP BY
version et ils seront les mêmes.En MySQL , «
Group By
» utilise une étape supplémentaire:filesort
. Je me rends compte queDISTINCT
c'est plus rapide queGROUP BY
, et c'était une surprise.la source
Après de lourds tests, nous sommes arrivés à la conclusion que GROUP BY est plus rapide
SELECT sql_no_cache opnamegroep_intern FROM
telwerken
WHEREopnemergroep
IN (7,8,9,10,11,12,13) group by opnamegroep_intern635 totaal 0,0944 secondes Weergave van enregistre 0-29 (635 totaal, requête duurde 0,0484 sec)
SELECT sql_no_cache distinct (opnamegroep_intern) FROM
telwerken
WHEREopnemergroep
IN (7,8,9,10,11,12,13)635 totaal 0,2117 secondes (presque 100% plus lent) Weergave van enregistre 0-29 (635 totaal, requête duurde 0,3468 sec)
la source
(plus d'une note fonctionnelle)
Il y a des cas où vous devez utiliser GROUP BY, par exemple si vous voulez obtenir le nombre d'employés par employeur:
Dans un tel scénario
DISTINCT u.employer
ne fonctionne pas correctement. Il y a peut-être un moyen, mais je ne le sais tout simplement pas. (Si quelqu'un sait comment faire une telle requête avec DISTINCT, veuillez ajouter une note!)la source
Voici une approche simple qui imprimera les 2 temps écoulés différents pour chaque requête.
OU essayez SET STATISTICS TIME (Transact-SQL)
Il affiche simplement le nombre de millisecondes nécessaires pour analyser, compiler et exécuter chaque instruction comme ci-dessous:
la source
Ce n'est pas une règle
Pour chaque requête .... essayez séparément séparément puis regroupez par ... comparez le temps pour terminer chaque requête et utilisez le plus rapidement ....
Dans mon projet, j'utilise parfois le groupe par et d'autres distincts
la source
Si vous ne devez effectuer aucune fonction de groupe (somme, moyenne, etc. au cas où vous voudriez ajouter des données numériques à la table), utilisez SELECT DISTINCT. Je soupçonne que c'est plus rapide, mais je n'ai rien à prouver.
Dans tous les cas, si vous vous inquiétez de la vitesse, créez un index sur la colonne.
la source
SELECT DISTINCT sera toujours le même, ou plus rapide, qu'un GROUP BY. Sur certains systèmes (par exemple Oracle), il peut être optimisé pour être identique à DISTINCT pour la plupart des requêtes. Sur d'autres (comme SQL Server), cela peut être considérablement plus rapide.
la source
Si le problème le permet, essayez avec EXISTS, car il est optimisé pour se terminer dès qu'un résultat est trouvé (et ne pas tamponner de réponse), donc, si vous essayez simplement de normaliser les données pour une clause WHERE comme celle-ci
Une réponse plus rapide serait:
Ce n'est pas toujours possible mais une fois disponible, vous verrez une réponse plus rapide.
la source