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
35
demandé sur Jonathan Leffler 2008-11-30 11:39:45

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.)

62
répondu Vinko Vrsalovic 2008-11-30 08:53:14

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.

9
répondu Eran Galperin 2008-11-30 08:46:42

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.

5
répondu Mike Woodhouse 2008-11-30 10:18:37

Je m'attendrais à ce que la clause WHERE soit plus rapide, mais il est possible qu'ils optimisent exactement la même chose.

2
répondu ysth 2008-11-30 08:42:03

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.

2
répondu programmer 2013-01-03 19:43:18

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.

0
répondu Manoj Pandey 2015-03-24 07:45:31