Je sais que je dois écrire SUM
deux fois, si je souhaite l'utiliser dans une HAVING
clause (ou utiliser une table dérivée sinon):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Ma question est maintenant de savoir si ce n'est pas optimal ou non. En tant que programmeur, cette requête ressemble à la base de données va calculer la somme deux fois. Est-ce le cas, ou devrais-je compter sur des optimisations que le moteur DB fera pour moi?
Mise à jour: explication d'une requête comparable:
postgres=> explain select sum(counttodo) from orderline group by orderlineid having sum(counttodo) > 100;
QUERY PLAN
--------------------------------------------------------------------
HashAggregate (cost=1.31..1.54 rows=18 width=8)
Filter: (sum(counttodo) > 100)
-> Seq Scan on orderline (cost=0.00..1.18 rows=18 width=8)
(3 rows)
postgresql
best-practices
aggregate
alias
Bart Friederichs
la source
la source
HAVING
clause - mais, à ma connaissance, en interne, cela se fait plutôt dans l'autre sens.HAVING
(puis en tirant la définition de la colonne de laSELECT
clause) - pour une raison quelconque, ils ne le font tout simplement pas.Réponses:
La somme n'est calculée qu'une seule fois.
J'ai vérifié cela en utilisant
puis utilisé un débogueur pour vérifier combien de fois
int4_sum
(la fonction de transition derrière l'sum
agrégat) a été appelée: une fois.la source
Comparez votre requête
À cet équivalent, vérifiez ce qu'ils diffèrent
la source
Vous ne devez écrire
SUM
deux fois si vous n'avez pas besoin de le récupérer; si vous êtes seulement intéressé par le fait d'id
avoir un,SUM(hours) > 50
alors ce qui suit est parfaitement valable:la source