2014-02-14 39 views
2

所有記錄的儀表板網頁,其中做了很多的分析來顯示圖形和表格數據給用戶的工作。軌道4:儀表盤/分析和查詢數據庫

當儀表板由一個給定的過濾年,我要顯示來自所有時間選定年分析,又是一年選擇用於比較,並且歷史平均值。

對於選擇和比較年,我創建了被設置爲beginning_of_year和END_OF_YEAR開始/結束日期時間對象。

year = Model.where("closed_at >= ?", start).where("closed_at <= ?", end).all 
comp = Model.where("closed_at >= ?", comp_start).where("closed_at <= ?", comp_end).all 

這些查詢基本上是一樣的,只是不同的日期過濾器。除了試圖只「選擇(...)」我需要的字段外,我並不認爲有任何方法可以對此進行優化,這可能是所有這些字段。

由於會有250-1000的記錄在某一年的平均而言,他們並不「可怕」(我不是非常熟練的意見)。

然而,歷史平均水平是造成我很多痛苦。爲了充分顯示平均值,我必須查詢所有時間的所有記錄並對它們進行計算。這是一個壞主意,但我不知道如何解決它。

all_for_average = Model.all 

當然人們以前遇到過這類問題,並有一些優化它們的方法嗎?在2000-50000個歷史記錄中迴歸歷史平均分析的地方並不是非常有效。但是,除非我首先檢索記錄,否則我不會看到執行分析的另一種方法。

選項1:抓住用Ruby

既然我已經通過Model.all抓住一切的一切,過濾器,我「可能」通過簡單地從歷史平均抓住所需的記錄,而不是刪除2年的查詢。但是這似乎是錯誤的......我真的「下載」我的數據庫(可以這麼說),然後用Ruby代碼而不是SQL來查詢它。看起來效率很低。有沒有人嘗試過,看到任何性能增益?

選項2:使用多個SQL數據庫調用來獲得選擇信息

這意味着,而不是抓住所有記錄給定的時間段,我會做一些數據庫查詢來獲得從該「答覆」 DB而不是分析Ruby中的數據。

相反運行這樣的,

year = Model.where("closed_at >= ?", start).where("closed_at <= ?", end).all 

我將執行多個查詢:

year_total_count = Model.where(DATE RANGE).size 
year_amount_sum = Model.where(DATE RANGE).sum("amount") 
year_count_per_month = Model.where(DATE RANGE).group("MONTH(closed_at)") 
...other queries to extract selected info... 

同樣,這似乎是非常低效的,但我不是知識淵博足夠的瞭解SQL和Ruby代碼知道哪些會導致明顯的缺點。

我「可以」代碼兩條路線,然後比較它們彼此,但還需要幾天的代碼/運行它們,因爲有很多的我要離開了儀表板頁面上的信息。當然,這些情況已經多次用於儀表板/分析頁面;這些類型的情況是否有一個總體原則?

我使用PostgreSQL on Rails的4.我一直在尋找到具體的DB-解決方案,以及,爲「數據庫無關」真的是無關緊要的大多數應用。

回答

0

與其他更有經驗的DBA和開發人員討論這個問題後,我決定,我想,以優化並不需要任何優化又一個問題。

對於我的具體使用情況下,我會每天從每個5-20倍的任何地方運行這些查詢幾百個用戶,那麼我是不是真的有重大的性能問題(即我不是一個谷歌或亞馬遜每天處理數十億次請求)。

我其實只是有PostgreSQL的數據庫執行查詢每一次,我都沒有注意到我的用戶任何重大的性能問題;頁面加載速度非常快,查詢/圖形沒有明顯的延遲。

對於其他人試圖解決同樣的問題,我建議您嘗試運行了一段時間登臺環境看,如果你真的有需要首先解決的問題。

如果我遇到性能障礙,我的第一步將專門索引我查詢的數據,而第二步將創建數據庫視圖,比每次查詢實時數據時更有效地「預加載」查詢。

由於在DB的速度和技術的進步令人難以置信,但是,我不擔心這個問題。

我回答我自己的問題,以便其他人可以花時間解決更有利的問題。

0

丹,我會考慮使用物化視圖(MV)的歷史平均水平。這肯定會屬於「特定於數據庫的」解決方案類別,因爲MV在不同數據庫中有不同的實現方式(或者根本沒有)。 Here is the basic PG documentation

物化視圖本質上是一個物理表,除了其數據基於其他表的查詢。在這種情況下,您可以創建基於平均歷史數據的查詢的MV。如果基礎數據沒有改變,這個查詢只運行一次。然後,儀表板可以對此MV執行簡單的讀取查詢,而不是在基礎表上運行代價高昂的查詢。

+0

我實際上並沒有「解決」它解決了這個問題。我發現我可以運行這些查詢,並且沒有任何明顯的性能問題,它運行良好。這是我爲一個實際上並不需要它的問題進行優化的情況。我可能會在將來發現我需要優化(希望隨着用戶羣的增加!),並且在那一點上,我認爲數據庫視圖可能是一個很好的解決方案。 –