web-dev-qa-db-fra.com

Quelle instruction SQL est la plus rapide? (AYANT OU OERE ...)

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
41
M_1

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 HAVING restreint le jeu de résultats après avoir apporté toutes les lignes. Alors, O is est plus rapide. À cet égard, sur les SGBD conformes à SQL Standard, utilisez uniquement HAVING où vous ne pouvez pas placer 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.)

70
Vinko Vrsalovic

Cela peut dépendre du moteur. MySQL par exemple, applique HAVING presque en dernier dans la chaîne, ce qui signifie qu'il n'y a presque pas de place pour l'optimisation. Depuis le 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 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
Eran Galperin

Les deux requêtes sont équivalentes et votre optimiseur de requête SGBD devrait reconnaître cela et produire produire le même plan de requête. Ce n'est peut-être pas le cas, mais la situation est assez simple à reconnaître, je m'attends donc à ce que tout système moderne - même Sybase - y fasse face.

Les clauses HAVING doivent être utilisées pour appliquer des conditions aux fonctions de groupe, sinon elles peuvent être intégrées dans la condition WHERE. Par exemple. si vous souhaitez restreindre votre requête aux groupes dont COUNT (DZIALU)> 10, par exemple, vous devez placer la condition dans un HAVING car elle agit sur les groupes, pas sur les lignes individuelles.

5
Mike Woodhouse

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

2
ysth

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 alternative à une clause where. Ayant un usage particulier d'être appliqué à un groupe par lequel quelque chose comme une somme () a été utilisé et vous souhaitez limiter le jeu de résultats pour afficher uniquement les groupes ayant une somme ()> supérieure à 100 en soi. Ayant des travaux sur les groupes, où fonctionne sur les lignes. Ce sont des pommes et des oranges. Donc vraiment, il ne faut pas les comparer car ce sont deux animaux très différents.

2
programmer

Les deux instructions auront les mêmes performances que SQL Server est suffisamment 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 devez utiliser la clause WHERE syntaxiquement.

0
Manoj Pandey