2012-01-26 68 views
0

我有一個應用程序在時態數據上運行模擬。計算過程並不複雜,但計算需要在同一模擬中先前預測的時間數據。如何替換TSQL光標和標量函數

我們假設使用1周的數據和15分鐘間隔的數據點進行模擬。爲預測值的簡化計算如下:

PredictedValue = A + B + C + D 

爲了得到B,C,和d的值,模擬需要先前計算在t0數據,T-1,T-95,T-96 ,t-672和t-673。這是當前和前一個時間間隔,前一個當前和前一個時間間隔以及前一個星期的當前和前一個時間間隔的時間數據。

我有一個可以在任何時間段模擬數據的工作實現,但是對於大型數據集,性能非常差。

該實現使用TSQL遊標在仿真和標量函數下循環時間數據以檢索先前計算的數據。

基本上數據集越大,模擬運行越慢。例如,使用1天的數據的模擬需要1分鐘的時間<;一個月的數據模擬需要2-3天。

我對如何在不使用遊標或標量函數的情況下改進TSQL代碼的性能非常感興趣。

+1

爲您現有的實現共享一些代碼。我們可以幫助您使用集合而不是光標來重新編寫它 – 2012-01-26 22:42:37

+0

您可以發佈一些代碼嗎? – Beth 2012-01-26 22:43:36

+0

日期/時間的性能問題通常與索引(或缺少索引)有關,並且在WHERE子句中使用功能不當。如果您強制DB引擎將功能應用於表中的每一行,例如WHERE YEAR(DATE_COL)> 2000年,隨着表的增長,您會看到性能下降。 – HABO 2012-01-26 23:15:56

回答

1

在這種情況下,我會建議使用自連接。然後SQL服務器可以將您的查詢作爲一個集合進行處理,從而大大提高速度。

簡單的例子,假設表有兩列(日期值),被稱爲數據

SELECT (A.value + B.value) as Prediction 
FROM [Data] A left join [Data] B 
ON B.date = dateadd(day,-1, A.date) 

(沒有測試,所以可能包含錯字的做 - 但我希望你得到的圖片)。

祝你好運,奧托。