Estou no processo de reescrever consultas que não extraem mais todos os dados necessários. Minha pergunta é em relação a uma prática que nunca vi e não encontrei nenhuma pergunta no StackExchange que aborde especificamente o problema.
Eu sei que o objetivo da HAVING
declaração é introduzir condições em agregações, assim como WHERE
introduz condições em linhas individuais. No entanto, o que estou vendo neste código está HAVING
sendo usado em vez de WHERE
consultas com agregações. As condições em HAVING
não são aplicadas nas agregações, mas nas colunas não agregadas.
Por exemplo:
SELECT id, filedate, SUM(amount)
FROM Sales
GROUP BY id, filedate
HAVING id = 123 AND filedate = '1/1/2018'
Ao contrário de:
SELECT id, filedate, SUM(amount)
FROM Sales
WHERE id = 123 AND filedate = '1/1/2018'
GROUP BY id, filedate
Existem implicações de desempenho ou outras vantagens/desvantagens para esta estratégia?
Eu não tentei executar diagnósticos por conta própria, não é uma prioridade e teria que fazer isso no meu próprio tempo. No entanto, acho que posso, se não houver uma resposta clara sobre isso.
Minha preocupação é como o otimizador visualiza essa consulta. Ele agrega todos os dados e, em seguida, restringe o conjunto de resultados com base na HAVING
cláusula ou percebe que pode aplicar as condições de ter nas linhas individuais, pois elas estão referenciando especificamente colunas não agregadas?
EDIT: Para minhas consultas de exemplo e o SQL real que estou reescrevendo, os planos são idênticos, mas as consultas são de complexidade semelhante e ainda não tenho conhecimento suficiente para tirar conclusões dos planos idênticos.