SQL Server求平均值时,要考虑如何在一定注重实时响应和数据一致性的同时,最大程度的提高性能。将涉及的表的数据按照条件进行过滤,能删去不必要的记录,减少计算量,是一种最简单的实现优化的方式。
如果常用的WHERE子句无法减少查询的记录数,可以尝试使用表行函数或逻辑分组。表行函数提供了使用复杂APP函数和其他运算,对记录进行分级。使用表行函数,可以解决大部分聚集统计函数的计算问题,像求平均值这样的简单统计计算,也可以通过表行函数进行求解,如下例所示:
select type, avg(rows) as AverageRows
from (select type, row_number() over
(partition by type order by type) as rows
from mytable) as t
group by type
逻辑分组是在表行函数的基础上进行的编程技术,利用或运算或逻辑表达式进行分组,以简化复杂查询。由于逻辑分组可以拆分复杂查询,减少在数据库中查询的记录条数,因此可以提高求平均值操作的性能。
以一个求以一年内某种产品的多个地点销售量的平均值为例,具体查询如下:
select product,Avg(sales)
from sales_data
where DATEDIFF(year,insert_date,getdate())
group by product
上面的查询采用基本的GROUP BY子句来实现,但是每次都要读取所有满足条件的记录才能求出平均值,因此如果数据量很大,则效率会很低。在这种情况下,可以采用逻辑分组来减少查询记录数:
SELECT product, Avg(sales1+sales2+...+salesn)/COUNT(*)
FROM (
SELECT product, sales1, sales2, ..., salesn
FROM sales_data
WHERE DATEDIFF(year, insert_date, getdate())
GROUP BY product
)AS t
GROUP BY product
这样的查询只需要读取满足条件的数据,并做一次分组,就可以求出多项销售量的平均值。
总结一下,SQL Server求平均值时,首先应确保选取的查询的准确性,尽量减少查询的记录数,灵活运用表行函数或逻辑分组可以提高查询性能。减少不必要的操作,以及正确使用运算符,也会极大提高求平均值操作的性能。