Eu sei que tenho que escrever SUM
duas vezes, se desejar usá-lo em uma HAVING
cláusula (ou usar uma tabela derivada de outra forma):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Minha pergunta agora é se isso é ou não ideal. Como programador, essa consulta parece que o banco de dados calculará a soma duas vezes. É assim ou devo confiar nas otimizações que o mecanismo de banco de dados fará por mim?
Atualização: uma explicação de uma consulta comparável:
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
fonte
fonte
HAVING
cláusula - mas, no meu entendimento, internamente isso é feito de outra maneira.HAVING
(e depois puxando a definição da coluna daSELECT
cláusula) - por alguma razão, eles simplesmente não fazem isso.Respostas:
A soma é calculada apenas uma vez.
Eu verifiquei isso usando
e, em seguida, usou um depurador para verificar quantas vezes
int4_sum
(a função de transição atrás dosum
agregado) foi chamada: uma vez.fonte
Compare sua consulta
Para este equivalente, verifique o que diferem
fonte
Você não precisa escrever
SUM
duas vezes se não precisar recuperá-lo; se você estiver interessado apenas emid
ter umSUM(hours) > 50
, o seguinte é perfeitamente válido:fonte