Sé que tengo que escribir SUM
dos veces, si deseo usarlo en una HAVING
cláusula (o usar una tabla derivada de lo contrario):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Mi pregunta ahora es si esto es subóptimo o no. Como programador, esta consulta parece que el DB calculará la suma dos veces. ¿Es así o debo confiar en las optimizaciones que el motor DB hará por mí?
Actualización: una explicación de una consulta 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
fuente
fuente
HAVING
cláusula, pero, a mi entender, internamente esto se hace al revés.HAVING
(y luego sacando la definición de columna de laSELECT
cláusula) - por alguna razón simplemente no hacen eso.Respuestas:
La suma solo se calcula una vez.
Verifiqué esto usando
y luego usó un depurador para verificar cuántas veces
int4_sum
(la función de transición detrás delsum
agregado) se llamó: una vez.fuente
Compara tu consulta
Para este equivalente, un cheque en lo que difieren
fuente
No tiene que escribir
SUM
dos veces si no necesita recuperarlo; si solo está interesado en queid
s tenga un mensaje,SUM(hours) > 50
entonces lo siguiente es perfectamente válido:fuente