2014-12-19 90 views
-1

嗨我正在寻找一种方法来过滤计算列。 我只是使用HAVING。SQL HAVING性能

我想知道是否需要重复计算有和select,我的SQL必须计算两次,因此有性能影响。

即:

USE AdventureWorks2012 ; 
GO 
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal 
FROM Sales.SalesOrderDetail 
GROUP BY SalesOrderID 
HAVING SUM(LineTotal) > 100000.00 
ORDER BY SalesOrderID ; 
+0

添加了sql-server标记,因为这看起来很像SQL Server。 –

+0

您是否将此查询与没有'HAVING'的同一个查询进行了比较?验证应该非常简单。 – Andrew

+0

我现在的样本数据库是小的来衡量它 – Flib

回答

2

在做计算的费用是在安排group by。与组织数据相比,执行额外的聚合功能会增加很少的开销。另外,SQL Server可能足够智能,只能计算sum()一次 - 我不知道,但这将是一个非常合理的优化。

注意:这是传统的聚合功能。有些(如count(distinct))或统计函数会产生更多的开销,因此您需要更多地小心多次调用它们。

+0

由于我定义了一个字段名称“SUM(LineTotal)AS小计”没有办法做这样的事情:“HEAVING SubTotal> 100000.00”? – Flib

+0

@Flib。 。 。你可以在子查询中做到这一点。但是,它确实没有必要。与以组为单位排列数据相比,额外的聚合函数的开销是微乎其微的。 –