Я знаю, что должен написать SUM
дважды, если я хочу использовать его в HAVING
предложении (или использовать производную таблицу в противном случае):
SELECT id,
sum(hours) AS totalhours
FROM mytable
GROUP BY id
HAVING sum(hours) > 50;
Мой вопрос сейчас заключается в том, является ли это неоптимальным. Как программист, этот запрос выглядит так, как будто БД рассчитает сумму дважды. Это так, или я должен полагаться на оптимизацию, которую мне сделает механизм БД?
Обновление: объяснение сопоставимого запроса:
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
Барт Фридрихс
источник
источник
HAVING
предложении - но, насколько я понимаю, внутренне это делается скорее наоборот.HAVING
(а затем извлечение определения столбца изSELECT
пункта) - по какой-то причине они просто не делают этого.Ответы:
Сумма рассчитывается только один раз.
Я подтвердил это с помощью
и затем использовал отладчик, чтобы проверить, сколько раз
int4_sum
(функция перехода заsum
агрегатом) была вызвана: один раз.источник
Сравните ваш запрос
К этому эквивалентному чеку, чем они отличаются
источник
Вам не нужно писать
SUM
дважды, если вам не нужно получать его; если вас интересуют только те, уid
которых есть a,SUM(hours) > 50
то совершенно верно следующее:источник