我正在重写不再提取所有必需数据的查询。我的问题是关于我从未见过的一种做法,也没有在 StackExchange 上找到任何专门解决该问题的问题。
我知道该HAVING
语句的重点是在聚合上引入条件,就像WHERE
在单个行上引入条件一样。但是,我在这段代码中看到的内容HAVING
被用来代替WHERE
聚合查询。中的条件HAVING
不应用于聚合,而是应用于非聚合列。
例如:
SELECT id, filedate, SUM(amount)
FROM Sales
GROUP BY id, filedate
HAVING id = 123 AND filedate = '1/1/2018'
相对于:
SELECT id, filedate, SUM(amount)
FROM Sales
WHERE id = 123 AND filedate = '1/1/2018'
GROUP BY id, filedate
此策略是否存在性能影响或其他优点/缺点?
我没有尝试自己运行诊断程序,这不是优先事项,我必须自己做。但是,如果对此没有明确的答案,我想我可能会。
我关心的是优化器如何查看这个查询。它是聚合所有数据,然后根据HAVING
子句限制结果集,还是意识到它可以对各个行应用具有条件,因为它们专门引用非聚合列?
编辑:对于我的示例查询和我正在重写的实际 SQL,计划是相同的,但查询具有相似的复杂性,我还没有足够的知识从相同的计划中得出结论。