在下面的查询中,SQL是否需要计算两次SUM(MY_INDICATOR) (每个使用它的字段计算一次),还是优化为只执行一次聚合?
SELECT
ID,
SUM(MY_INDICATOR) AS MY_SUM,
SUM(MY_INDICATOR) / COUNT(*) AS MY_RATE
FROM
SOMETABLE
GROUP BY
ID更新:在查看一些执行计划Thorsten是正确的之后,SQL Server优化器将生成一个只需要执行一次SUM(MY_INDICATOR)的执行计划。不需要CTE来优化查询。
发布于 2018-05-31 03:35:38
您所担心的优化是相当不相关的。聚合查询的开销在于读取数据并对其进行重新排列,以便可以同时处理公共键值。简单的sum()不是性能问题。
也就是说,假设my_indicator不是NULL,您可以将逻辑简化为:
SELECT ID, SUM(MY_INDICATOR) AS MY_SUM,
AVG(MY_INDICATOR * 1.0) AS MY_RATE
FROM SOMETABLE
GROUP BY ID;* 1.0是因为SQL Server执行整数运算--为了避免这种情况(即使在您的版本中也是如此),您希望将其转换为带有小数位的数字格式。
我经常把这个逻辑写成:
avg(case when my_indicator = 1 then 1.0 else 0 end)发布于 2018-05-31 02:29:06
它必须计算两次,你可以这样做,所以你只需要计算一次:
SELECT ID, MY_SUM,
MY_SUM / MY_COUNT AS MY_RATE
FROM ( SELECT ID,
SUM(MY_INDICATOR) AS MY_SUM,
COUNT(*) AS MY_COUNT
FROM SOMETABLE
GROUP BY ID
) t;https://stackoverflow.com/questions/50611260
复制相似问题