Quelle instruction SQL est la plus rapide? (Ayant vs. où…)
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
GROUP BY NR_DZIALU
HAVING NR_DZIALU = 30
Ou
SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
FROM PRACOWNICY
WHERE NR_DZIALU = 30
GROUP BY NR_DZIALU
6 réponses
La théorie (par théorie, je veux dire SQL Standard) dit que WHERE restreint le jeu de résultats avant de renvoyer des lignes et d'avoir restreint le jeu de résultats après avoir apporté toutes les lignes. Mais OÙ est donc plus rapide. Sur les SGBD conformes à la norme SQL à cet égard, utilisez uniquement HAVING where vous ne pouvez pas mettre la condition sur un WHERE (comme les colonnes calculées dans certains SGBDR.)
Vous pouvez simplement voir le plan d'exécution pour les deux et vérifier par vous-même, rien ne battra cela (mesure pour votre requête spécifique dans votre environnement spécifique avec vos données.)
Cela peut dépendre du moteur. MySQL par exemple, s'applique ayant presque la dernière dans la chaîne, ce qui signifie qu'il n'y a presque pas de place pour l'optimisation. Du manuel :
La clause HAVING est appliquée presque en dernier, juste avant que les éléments ne soient envoyés au client, sans optimisation. (Limite est appliquée après avoir.)
Je crois que ce comportement est le même dans la plupart des moteurs de base de données SQL, mais je ne peux pas le garantir.
Les deux requêtes sont équivalentes et votre optimiseur de requête SGBD devrait le reconnaître et produire le même plan de requête. Ce n'est peut - être pas le cas, mais la situation est assez simple à reconnaître, donc je m'attends à ce que n'importe quel système moderne - même Sybase-y fasse face.
Les clauses HAVING doivent être utilisées pour appliquer des conditions sur les fonctions de groupe, sinon elles peuvent être mvoed dans la condition WHERE. Exemple. si vous souhaitez limiter votre requête aux groupes ayant COUNT (DZIALU) > 10, disons, vous auriez besoin de mettre la condition dans un avoir parce qu'il agit sur les Groupes, pas les lignes individuelles.
Je m'attendrais à ce que la clause WHERE soit plus rapide, mais il est possible qu'ils optimisent exactement la même chose.
Dire qu'ils optimiseraient n'est pas vraiment prendre le contrôle et dire à l'ordinateur quoi faire. Je conviens que l'utilisation de l'avoir n'est pas une solution de rechange à une clause where. Having a une utilisation spéciale d'être appliqué à un groupe par où quelque chose comme un sum () a été utilisé et vous voulez limiter le jeu de résultats pour montrer uniquement les groupes ayant un sum () > que 100 en soi. Avoir des travaux sur des groupes, où fonctionne sur des lignes. Ils sont les pommes et les oranges. Donc vraiment, ils ne devraient pas être comparés car ils sont deux des animaux très différents.
Les deux instructions auront les mêmes performances que SQL Server est assez intelligent pour analyser les deux mêmes instructions dans un plan similaire.
Donc, peu importe si vous utilisez WHERE ou HAVING dans votre requête.
Mais, idéalement, vous devriez utiliser la clause WHERE syntaxiquement.