Question

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
Était-ce utile?

La solution

La théorie (par théorie, j'entends norme SQL ) indique que WHERE limite le jeu de résultats avant de renvoyer des lignes et HAVING restreint le jeu de résultats après avoir mis toutes les lignes. Alors, où est plus rapide. À cet égard, sur les SGBD conformes à la norme SQL Standard, utilisez uniquement HAVING dans les cas où vous ne pouvez pas poser 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 l'emportera (mesure de votre requête spécifique dans votre environnement spécifique avec vos données).

Autres conseils

Cela dépend du moteur. MySQL, par exemple, applique HAVING presque en dernier dans la chaîne, ce qui signifie qu’il n’ya pratiquement pas de place pour l’optimisation. Extrait du manuel :

  

La clause HAVING est appliquée presque en dernier, juste avant l'envoi des éléments au client, sans optimisation. (LIMIT est appliqué après HAVING.)

Je pense que ce comportement est identique 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 doit 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. C’est pourquoi tout système moderne, même Sybase, devrait en tenir compte.

Les clauses HAVING doivent être utilisées pour appliquer des conditions aux fonctions de groupe, sinon elles peuvent être transférées dans la condition WHERE. Par exemple. si vous souhaitez limiter votre requête aux groupes dotés de COUNT (DZIALU) > 10, disons, vous devez mettre la condition dans un HAVING car elle agit sur les groupes et non sur 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, ce n'est pas vraiment prendre le contrôle et dire à l'ordinateur quoi faire. Je conviens que le fait d’avoir le mot «have» n’est pas une alternative à la clause where. Ayant une utilisation particulière d'être appliqué à un groupe par où quelque chose comme une somme () a été utilisé et vous voulez limiter le jeu de résultats pour afficher uniquement les groupes ayant une somme () > que 100 en soi. Avoir des travaux sur des groupes, Où fonctionne sur des lignes. Ce sont des pommes et des oranges. Alors vraiment, il ne faut pas les comparer car ce sont deux animaux très différents.

Les deux instructions auront les mêmes performances que SQL Server est suffisamment intelligent pour les analyser dans un même plan.

Donc, peu importe si vous utilisez WHERE ou HAVING dans votre requête.

Mais, idéalement, vous devriez utiliser la clause WHERE syntaxiquement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top