2010-09-02 75 views
1

希望對大量數據執行平均計算。數據通常從設備中捕獲,我們希望獲得最後一天的平均數,上週的平均數,上個月的平均數以及上一年的平均數。在SQL Server中平均大量數據

不幸的是,取出去年數據的平均值需要幾分鐘才能完成。我只有SQL的基本知識,並希望有一些很好的信息來加快速度。

該表具有時間戳,標識數據屬於哪個設備的標識以及浮點數據值。

我一直在使用的查詢遵循如下這個普通的例子:

select avg(value) 
from table 
where id in(1,2,3,4) timestamp > last_year 

編輯:我應該還明確,他們要求這些平均數字來滾動計算。如同「年迄今」的平均值。我確實意識到,僅僅是因爲結果數量龐大,我們可能不得不妥協。

回答

0

你可以做一個緩存表,統計緩存,它應該有類似的這種結構的東西:

year | reads_sum | total_reads | avg 
=====|============|=============|===== 
2009 | 6817896234 | 564345  | 

在今年年底,你填寫AVG(平均)字段的,現在快計算,價值。

+0

謝謝你的迴應。希望我可以要求他們修改他們的系統以適應這一點。 我得仔細考慮一下,他們確實需要一個「年迄今」的平均值來經常計算。 – user438199 2010-09-02 17:56:31

+0

不客氣,我編輯了將「臨時表」改爲「緩存表」的答案,因爲我不是指「臨時表」可能涉及的記憶生活表。 – aularon 2010-09-03 08:12:56

1

對於這類問題,你可以嘗試以下解決方案: 1)優化查詢:看查詢計劃,創建一些指標,碎片整理現有的,運行查詢時,服務器是免費的,等 2)創建一個緩存表。 要填充緩存表,請選擇以下策略之一: 1)在影響結果的表上使用觸發器,並在插入,更新,刪除刷新緩存表時使用觸發器。觸發器應該運行非常非常快。其他條件是不阻止任何記錄(否則如果服務器繁忙,最終會陷入死鎖狀態) 2)每天/每小時等待一個作業填充緩存表3)我喜歡的一種解決方案是當需要結果時(例如,用戶請求報告時),由SP填充緩存,並使用某些邏輯來序列化進程(一次只有一個用戶可以生成緩存),再加上一些優化以不重新計算下一次是相同的行(例如:如果昨天沒有添加任何行,並且緩存中的結果是昨天,我不重新計算該值 - 只計算上次運行的新值)

0

您可能要考慮在時間戳上創建聚簇索引。通常聚集索引浪費在ID上。對此的一個警告,如果沒有明確的排序,其他sql語句輸出的排序順序可能會改變。