Clause Having vs sous-requête
Je pourrais écrire une requête à l'aide d'une fonction d'agrégation de deux façons:
select team, count(min) as min_count
from table
group by team
having count(min) > 500
ou
select *
from (
select team, count(min) as min_count
from table
group by team
) as A
where A.min_count > 500
Sont là des avantages de performances de l'un et l'autre ou sont-ils fonctionnellement la même chose?
Plus important encore: ils Sont sémantiquement identiques?
avez-vous tester ou de révision du plan d'expliquer?
Pouvez-vous montrer le plan d'exécution de requête?
C'est une question qui doit être posée en termes de principes généraux. La mesure d'un seul cas n'est pas ce qui est demandé ici. Cela ne prouve rien sur les autres cas.
Vous semblez avoir omis certaines informations indispensables pour des questions de performances. Ce SGBD spécifique demandez-vous? Parce qu'il revient à la recherche à la mise en œuvre dans ce SGBD.
avez-vous tester ou de révision du plan d'expliquer?
Pouvez-vous montrer le plan d'exécution de requête?
C'est une question qui doit être posée en termes de principes généraux. La mesure d'un seul cas n'est pas ce qui est demandé ici. Cela ne prouve rien sur les autres cas.
Vous semblez avoir omis certaines informations indispensables pour des questions de performances. Ce SGBD spécifique demandez-vous? Parce qu'il revient à la recherche à la mise en œuvre dans ce SGBD.
OriginalL'auteur ferics2 | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
Les deux versions sont identiques dans leur fonctionnement. Eh bien, le second est syntaxiquement incorrect, mais je suppose que vous voulez dire:
(Vous avez besoin de l'alias sur le calcul et plusieurs grandes bases de données nécessitent un alias sur une sous-requête dans un
FROM
clause.)Étant fonctionnellement équivalent ne pas dire qu'ils sont forcément optimisés de la même façon. Il y a souvent plusieurs façons d'écrire une requête qui sont fonctionnellement équivalents. Cependant, la base de données spécifique du moteur/de l'optimiseur peut choisir (et souvent ne choisir) l'optimisation des différents chemins.
Dans ce cas, la requête est tellement simple qu'il est difficile de penser à de multiples optimisation des chemins. Pour les deux versions, le moteur a essentiellement pour agréger teh requête, puis tester la deuxième colonne pour le filtre. Personnellement, je ne vois pas beaucoup de variations sur ce thème. Tout bon moteur SQL doit utiliser les index, le cas échéant, dans les deux cas ou aucun des deux.
Donc, la réponse à cette question est que dans une mesure raisonnable de la base de données, cela devrait déboucher sur le même plan d'exécution (c'est à dire, dans l'utilisation des index, l'utilisateur de parallélisme, et le choix de l'algorithme d'agrégation). Toutefois, étant fonctionnellement équivalent ne signifie pas qu'un moteur de base de données est en cours pour produire la même exeuction plan. Donc, de manière générale, la réponse est "non".
OriginalL'auteur Gordon Linoff