2010-09-20 53 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。如果您無法更改數據庫,則可以將數據從數據庫中提取到您自己的數據庫中。只需在將列插入到自己的數據庫中時計算列。然後從您自己的數據庫中運行您的查詢。