Ich weiß SUM
, dass ich zweimal schreiben muss , wenn ich es in einer HAVING
Klausel verwenden möchte (oder eine abgeleitete Tabelle anderweitig verwenden möchte ):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Meine Frage ist nun, ob dies nicht optimal ist oder nicht. Als Programmierer sieht diese Abfrage so aus, als würde die DB die Summe zweimal berechnen. Ist das so oder sollte ich mich auf Optimierungen verlassen, die die DB-Engine für mich vornehmen wird?
Update: eine Erklärung einer vergleichbaren Abfrage:
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
quelle
quelle
HAVING
Klausel verweisen - nach meinem Verständnis erfolgt dies intern eher umgekehrt.HAVING
(und anschließendes Ziehen der Spaltendefinition) erfolgen aus derSELECT
Klausel) - aus irgendeinem Grund tun sie das einfach nicht.Antworten:
Die Summe wird nur einmal berechnet.
Ich habe dies mit überprüft
und dann mit einem Debugger überprüft, wie oft
int4_sum
(die Übergangsfunktion hinter demsum
Aggregat) aufgerufen wurde: einmal.quelle
Vergleichen Sie Ihre Anfrage
Zu diesem Äquivalent wird geprüft, was sie unterscheiden
quelle
Sie müssen nicht haben , schreiben
SUM
zweimal , wenn Sie es nicht abrufen müssen; Wenn Sie nur daran interessiert sind, dass dieid
s eine haben,SUM(hours) > 50
dann ist Folgendes vollkommen gültig:quelle