使用T-SQL AVG或服用之后平均值结果使用LINQ返回
-
20-09-2019 - |
题
我有一个使用一个视图拉6个平均值的存储过程。 SQL数据库是SQL Server 2000中。当我在查询分析器运行它,它需要大约900秒。我能做些什么,以获得更好的性能?我应该返回使用LINQ行和确定平均呀?它会更快?
这是我的当前的存储过程的一个示例:
create procedure [TestAvg]
(
@CustomerNumber int
)
as
select
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P12D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P12D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P12D90,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P16D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P16D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P16D90
另外,让我澄清上述视图。由于这是SQL Server 2000中,我不能,因为它使用子查询使用索引视图。我想这可以被改写为使用连接。然而,最后时刻,我们采取了查询,并重写了它使用的连接,数据缺失(因为子查询可以返回这将忽略整行空值)。
解决方案
我会建议获取数据到一个表变种第一,也许2表瓦尔,1为12和1 16的ProductID。从这些表VARS,计算avgs根据需要,然后从SP返回东星
DECLARE @OrderDetails12 TABLE(
DateFulfilled DATETIME,
OrderTime FLOAT
)
INSERT INTO @OrderDetails12
SELECT DateFulfilled,
OrderTime
FROM OrderDetails
WHERE ProductID = 12
AND DateDiff(day, DateFulfilled, GetDate()) <= 90
and CustomerNumber = @CustomerNumber
DECLARE @OrderDetails16 TABLE(
DateFulfilled DATETIME,
OrderTime FLOAT
)
INSERT INTO @OrderDetails16
SELECT DateFulfilled,
OrderTime
FROM OrderDetails
WHERE ProductID = 16
AND DateDiff(day, DateFulfilled, GetDate()) <= 90
and CustomerNumber = @CustomerNumber
此外,在表创建正确的索引,将有很大的帮助。
其他提示
什么将数据保留在数据库服务器,如果它是未聚集的金额,多久做操作?在数据的大小的差将指导是否在服务器上的计算时间由传输时间和本地计算抵消。
此外 - 看看这个DATEDIFF
使用和更改更容易使其可优化(试行DateFullfilled> = SomeCalculatedDate1代替DATEDIFF
) - 检查你的执行计划,以确保它能够使用一个索引查找(最好)或索引扫描(良好),而不是一个table_scan。
此外,确保有上CUSTOMERNUMBER,ProduceID,DateFulfilled的索引。
不隶属于 StackOverflow