所有記錄的儀表板網頁,其中做了很多的分析來顯示圖形和表格數據給用戶的工作。軌道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-解決方案,以及,爲「數據庫無關」真的是無關緊要的大多數應用。
我實際上並沒有「解決」它解決了這個問題。我發現我可以運行這些查詢,並且沒有任何明顯的性能問題,它運行良好。這是我爲一個實際上並不需要它的問題進行優化的情況。我可能會在將來發現我需要優化(希望隨着用戶羣的增加!),並且在那一點上,我認爲數據庫視圖可能是一個很好的解決方案。 –