SQL Server中重复调用聚合函数是否影响性能?两查询对比
SQL Server函数重复调用与查询性能问题解答
问题1:同一函数多次出现是否影响运行速度与执行效率?
- 对于确定性函数(比如
SUM()、AVG()这类聚合函数,或是UPPER()、DATEADD()这类输入固定则输出固定的函数),SQL Server的查询优化器会自动识别重复调用,只执行一次计算后复用结果,不会额外消耗性能。 - 但如果是不确定性函数(比如
NEWID()、GETDATE()这类每次调用结果可能不同的函数),SQL Server会每次调用都重新计算,这种情况下多次出现就会增加计算开销,影响执行效率。
问题2:两个SQL查询哪个更快?多次使用SUM(Sales)会拖慢计算吗?
查询1代码:
SELECT Category, CASE WHEN SUM(Sales) > 1000000 THEN SUM(Sales) / 1.3 ELSE SUM(Sales) END AS Total FROM MyTable GROUP BY Category
查询2代码:
SELECT Category, CASE WHEN Sales > 1000000 THEN Sales / 1.3 ELSE Sales END AS Total FROM (SELECT Category, SUM(Sales) AS Sales FROM MyTable GROUP BY Category) AS p
这两个查询的性能几乎没有差异。SQL Server的查询优化器会识别到查询1中重复的SUM(Sales)调用,自动将其优化为只计算一次,再在CASE语句里复用结果。最终两个查询生成的执行计划大概率完全一致,所以执行速度没有区别。
不过查询2的写法更直观,显式先计算聚合值再使用,在复杂查询场景下更容易维护;查询1的写法更简洁,优化器也能很好地处理这类重复调用。
内容的提问来源于stack exchange,提问作者Brian Holsen
相关产品推荐
相关产品推荐

