2010-09-20 54 views
1

我有一个问题,有关最快的方式执行一个SQL Server查询表,TheTable,具有以下字段:TimeStamp,Col1,Col2,Col3,Col4
我不维护数据库,我只能访问它。我需要执行10个计算类似于:在SQL中执行多次计算的平均时间的最快方法?

Col2*Col3 + 5  
5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)  

然后我必须找到使用从选定的日数据计算结果的AVG和MAX(有8个月在数据库中的数据,到目前为止) 。由于数据每0.1秒采样一次,因此每次计算需要864000行。我想确保查询尽可能快地运行。有没有比这更好的方法:

SELECT AVG(Col2*Col3 + 5), 
    AVG(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)), 
    MAX(Col2*Col3 + 5), 
    MAX(5*POWER(Col3,7) + 4*POWER(Col2,6) + 3*POWER(Col1,5)) 
FROM TheTable 
WHERE TimeStamp >= '2010-08-31 00:00:00:000' 
    AND TimeStamp < '2010-09-01 00:00:00:000' 

谢谢!

回答

2

您可以创建这些作为计算(计算)列,并设置Is Persisted为true。这将在插入时将计算的值保留到磁盘上,并非常快速地对这些值进行后续查询。

或者,如果您无法修改表格架构,则可以创建一个Indexed View来计算您的值。

+0

我是一名SQL新手 - 这些列会成为表的永久部分吗?我应该提到这是一个我不保留的数据库。 – KAE 2010-09-20 17:01:13

+0

是的,他们会的。看到我的第二个建议。 – RedFilter 2010-09-20 17:02:00

+0

非常感谢。一旦我学会了如何制作索引视图,我将发布代码。 – KAE 2010-09-20 17:06:29

0

如何在插入数据时进行这些计算而不是在选择时进行计算?那么你只需要对这些值进行特定日期的计算。

TableName 
--------- 
TimeStamp 
Col1 
Col2 
Col3 
Col4 
Calc1 
Calc2 
Calc3 

,并插入像这样:

INSERT INTO TableName (...) 
VALUES 
(...,AVG(@Col2Val*@Col3Val + 5),...) 
+0

这是一个很好的建议,但我应该提到这实际上并不是我的数据库,所以我不确定数据库管理员是否希望我改变它。计算也经常发生变化。 – KAE 2010-09-20 17:00:03

+0

那么如果你必须进行计算,你必须进行计算。如果插入时无法执行此操作,则选择是在选择时执行,或者在选择所有内容后以代码的形式执行。 – 2010-09-20 17:09:54

0

您唯一的选择就是提前计算数值,要么是Computed Columns要么是在视图中持久存在的列,请参阅Improving Performance with SQL Server 2005 Indexed Views。如果您无法更改数据库,则可以将数据从数据库中提取到您自己的数据库中。只需在将列插入到自己的数据库中时计算列。然后从您自己的数据库中运行您的查询。